【问题标题】:PyQt5 - Used QThread to avoid ui hang but it still happensPyQt5 - 使用 QThread 来避免 ui 挂起,但它仍然会发生
【发布时间】:2016-04-19 13:06:27
【问题描述】:

我正在尝试制作一些东西来解析网站并将其内容显示在 PyQt 小部件上。

我已经完成了逻辑部分,但是 IO 任务将 ui 挂了几秒钟,使进度条无用。

所以我尝试使用线程,但没有帮助。

这是我正在做的事情的简化版本(我在 Python 3.4.4、Windows 10 上使用 PyQt5)

MainWindow 是 Qt Designer 生成的类。

from PyQt5 import QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal

class WorkerThread(QThread):
    signal = pyqtSignal(str)

    def __init__(self, data):
        QThread.__init__(self)

        self.data = data

    def __del__(self):
        self.wait()

    def run(self):
        result = dosomeIOjob(self.data) # IO and parsing job, takes about 3 seconds
        sendsomething(result)

    def sendsomething(self, value):
        self.signal.emit(value)

class UIClass(QtWidgets.QMainWindow, MainWindow.Ui_MainWindow):
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self)

        self.button.clicked.connect(self.dosomejob)

    def dosomejob(self):
        data = self.lineedit_search.text()
        self.runworker(self, data)

    def settext(value):
        self.text.setText(value)

    def runworker(self, data):
        worker = WorkerThread(data)
        worker.signal.connect(self.settext)
        worker.run()

没有错误;它只是挂起,直到工作完成。

我是否使用了 pyqtSignal 错误?对不起我的英语不好。

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    您需要传递类型 (str),以便 settext 获取并能够使用它。我也一直使用worker.start() 中的 start() 而不是 run() 来启动线程。不确定这会有所不同,只是我如何阅读/学习它。

    这是您需要更改的代码。 worker.signal[str].connect(self.settext)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2014-01-04
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多