首页 > 解决方案 > 为什么在 macOS 上使用 QThread 时 PyQt 应用程序崩溃或挂起?

问题描述

在 PyQt5 中调用线程类时,应用程序崩溃并出现错误:QThread: Destroyed while thread is still running if I don't add

def __del__(self): 
     self.wait()

将上述语句添加到线程类后,应用程序运行但停止,直到线程完成执行(基本上使线程无用)。我正在运行 macOS Catalina 10.15.6、Intel i9、Python 3.7.4。有什么办法可以解决这个问题?这是代码(ui窗口只有一个按钮):

from PyQt5.QtWidgets import QMainWindow
from PyQt5 import QtWidgets, uic
from PyQt5.QtCore import QThread, pyqtSignal
import sys, time

class Main(QMainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        uic.loadUi('main.ui', self)
        self.btn1.clicked.connect(self.run_worker)

    def run_worker(self):
        worker = Worker_thread()
        worker.start()


class Worker_thread(QThread):
    def __init__(self):
        QThread.__init__(self)

    def __del__(self):
         self.wait()

    def run(self):
        time.sleep(10)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    win = Main()
    win.show()
    sys.exit(app.exec_())

标签: python-3.xpyqt5qthread

解决方案


问题很简单:“worker”变量是一个局部变量,当它的作用域结束时它会被消除,在这种情况下,作用域是“run_worker”函数。当“run”方法被淘汰时,它不是在管理QThread的辅助线程中执行,而是在阻塞GUI的主线程中执行。

解决方案是扩展其范围,例如通过创建类属性:

def run_worker(self):
    self.worker = Worker_thread()
    self.worker.start()

注意:问题与操作系统无关。


推荐阅读