Qt Designer极速开发python桌面小工具详解

在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中显示了。

Qt Designer极速开发python桌面小工具详解

到了这一步,我们的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 --

文末寄语:  用自己的努力换取成功,然后成功就会像一个大巴掌,打在那些曾经看不起你的人脸上,要多响有多响,要多爽有多爽。

上一页123下一页


留言