5期
番外篇
问题搜索及程序整合
导读:本篇是本次番外篇的终结篇
LEARN MORE
正文
1
上期我们介绍了UI的设计、问题采集、问题识别。这期我们讲讲问题搜索及程序整合。
2
实现思路
既然界面设计好了、问题也采集、识别了,接下来就用百度搜下答案吧!
用百度搜索答案
实现的代码就一句
百度搜索的格式一般是这样:https://baidu.com/s?wd=xxxxxx,"wd="后面的就是我们得到的问题了。例如下图:
在系统的默认浏览器中访问url地址,如果new = 0,url会在同一个浏览器窗口中打开;如果new = 1,新的浏览器窗口会被打开;new = 2新的浏览器tab会被打开。
这里voice表示的是调用百度语音识别API后的返回值,其中result是类似[“北京天气”]的一个列表,所以我们通过列表切片方式以及str()函数将其强制转换成字符串:”北京天气”
用这个函数可以很简单的解决url中出现中文的编码问题,例如在url中出现“世界上的最高山”,编码后就变成这个了:
程序整合
解决好问题搜索,接下来我们把之前的程序稍微整合一下。
因为问题采集、问题识别都是需要花费时间的,如何更有效的在PyQt5中执行呢。
我先来做一个对比试验,假设我们要处理一项工作用时大约20s的样子,我们比较不同处理方式的异同:
方式一
方式二
方式一与方式二最大的区别就是我们采用了多线程这个方法。
为什么在GUI程序中,处理较长时间的步骤使用多线程呢?
因为长时间的工作导致UI主线程就没有办法刷新自己,要等很费时间的事情做完之后才能刷新,系统就认为这个窗口这么长时间没有刷新肯定挂了,就变成了未响应。而且,这让用户体验也变得非常低,窗口在等待的时候,不仅仅不能点击,连移动窗口都不行,如果等的久了,还可能被用户杀掉,所以分离工作线程是非常必要的。
在PyQt5中我使用的是QThread类(这个知识点较为复杂,后期单独成章节,本次只介绍最基本的使用),将工作线程与主线程分离。
那么怎么实现的呢?
下面的代码仅演示如何应用QThread类,具体实现功能的代码在前面几章已经讲解的很多,只需把相应的代码移至进去就行了。
我们通过新建一个Speech_Recognition_Thread类(继承了QThread),将大量耗时工作移植到run()函数中,实现线程分离。
我们新建一个Speech_Recognition_Thread类(继承了QThread),同时自定义一个返回值为str类型的信号。
我们把耗时的工作移至到run()函数中,当工作结束后,我们主动的发出信号’over’
当我们点击按钮的时候,我们将自定义的多线程类初始化,同时将初始化对象中的finished_signal()关联到_show_message()这个槽函数中。也就是说当耗时任务完成时发射'over'信号,该值被_show_message()接收后打印出来。
表明我们启动多线程程序。这个和普通的Python多线程程序启动方式类似啊。
我主讲的Python多线程编程的课程请见这里:
https://ke.qq.com/course/178707#tuin=d3584ba4
3
最后
所以请各位关注:学点编程吧,发送:pyqt5冲顶,获得全部的代码再次对照相应的文章研究,相信会有所提升的。也欢迎各位留言,相互学习,共同成长。
记得程序中的APP_ID、API_KEY、SECRET_KEY需要换成自己的啊!
加入我们的学习交流QQ群,一起学习吧!
领取专属 10元无门槛券
私享最新 技术干货