python-3.x - 为什么在 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_())
解决方案
问题很简单:“worker”变量是一个局部变量,当它的作用域结束时它会被消除,在这种情况下,作用域是“run_worker”函数。当“run”方法被淘汰时,它不是在管理QThread的辅助线程中执行,而是在阻塞GUI的主线程中执行。
解决方案是扩展其范围,例如通过创建类属性:
def run_worker(self):
self.worker = Worker_thread()
self.worker.start()
注意:问题与操作系统无关。
推荐阅读
- google-cloud-platform - 更改多个用户的 GCP IAM 角色
- python - 动画函数必须返回一系列 Artist 对象
- python - Pandas 在特定开始时间后使用增量时间重新采样
- angularjs - 如何在我的 Angular 项目中从 Gramarly 删除控制台中的警告:使用 DEFAULT 根记录器;使用默认时间序列实现
- python - setuptools.setup 的 name 参数值如何影响结果?
- c# - 如何使用 json 作为身份验证来创建 TranslationServiceClient?
- python-3.x - rdflib - > turtle 文件中的嵌套三元组值单位
- node.js - 获取每个月创建的文档计数(猫鼬节点 js)
- c# - C# Console.Write 没有显示 VS Studio,如何使用 System.Out.Println
- javascript - 使用 vanilla JS 在 .map 之后使用来自 API 的数据填充选择(下拉)