在GUI程序中,主线程也叫GUI线程,因为它是唯一被允许执行GUI相关操作的线程。对于一些耗时的操作,如果放在主线程中,就是出现界面无法响应的问题。
在编写QT的界面程序时,当我们调用QApplication.exec()时,我们就启动了QT的事件循环。在开始的时候,QT会发出一些事件来显示和绘制窗口部件。在这之后,事件循环就开始运行,不断地检查是不是有事件发生并且把这些事件发送给应用程序中的QObject。
当一个事件被处理时,其他事件也可能会产生并且追加到QT的事件队列中。如果我们在处理一个特定的事件上耗费过多的时间,用户界面就会变得不能够响应。
2、解决思路
解决该问题的方法有很多,如使用QTimer不断应答的,这里我还是喜欢以线程的方式来处理。
如把类似按钮触发代码:
ui.pushButton.clicked.connect(partial(sitemapgo, ui))
改为:
thread = RunThread(ui) # 创建一个线程 ui.pushButton.clicked.connect(lambda: thread.start())
3、实现处理线程
1)首先加入QtCore包的引用
from PyQt5 import QtCore from PyQt5.QtCore import *
2)把原来的sitemapgo函数处理逻辑填入run中进行简单的改造,具体怎么改造,相信有python基础的朋友来说都不难。如果没有python基础,建议学习下runoob.com中的基础教程。
具体线程类实现代码如下:
class RunThread(QThread): # python3,pyqt5与之前的版本有些不一样 # 通过类成员对象定义信号对象 # _signal = pyqtSignal(str) trigger = pyqtSignal() def __init__(self, ui): super(RunThread, self).__init__() self.ui = ui def __del__(self): self.wait() def run(self): #线程处理逻辑 try: …… #填入网站生成sitemap的逻辑 except: print("出现异常错误!") finally: self.trigger.emit() if __name__ == '__main__': app = QApplication(sys.argv) MainWindow = QMainWindow() ui = sitedog.Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() thread = RunThread(ui) # 创建一个线程 ui.pushButton.clicked.connect(lambda: thread.start()) sys.exit(app.exec_())
4、最后再来运行工具,就再也不会出现“未响应”错误了。
六、实现控制台显示
我们发现程序的输出都是在控制台打印的,非常不方便,这是该怎么输出到前端textBrowser中呢?这里我们修改gui_file_name.py文件(gui_file_name是什么?一头雾水请再复习下前面)
1、首先引入sys
import sys
2、定义发送信号槽
class EmittingStr(QtCore.QObject): textWritten = QtCore.pyqtSignal(str) #定义一个发送str的信号 def write(self, text): self.textWritten.emit(str(text))
3、在类Ui_MainWindow中开始处添加
class Ui_MainWindow(object): def __init__(self): # 下面将输出重定向到textBrowser中 sys.stdout = EmittingStr(textWritten=self.outputWritten) sys.stderr = EmittingStr(textWritten=self.outputWritten) def outputWritten(self, text): cursor = self.textBrowser.textCursor() cursor.movePosition(QtGui.QTextCursor.End) cursor.insertText(text) self.textBrowser.setTextCursor(cursor) self.textBrowser.ensureCursorVisible()
4、再来运行上面的sitemap生成工具,控制台没有再打印输出,都在textBrowser中显示了。
到了这一步,我们的PyQT5工具开发就基本告一段落了。怎么样,很简单吧?
参考文章:
https://blog.csdn.net/azuremouse/article/details/90338961
https://www.cnblogs.com/hhh5460/p/5175322.html
https://blog.csdn.net/weixin_38308549/article/details/105200032
http://www.45fan.com/article.php?aid=19062535244902109151948616
-- End --
文末寄语: 用自己的努力换取成功,然后成功就会像一个大巴掌,打在那些曾经看不起你的人脸上,要多响有多响,要多爽有多爽。