我有一个冻结PyQt5程序的大函数,我尝试使用不同的线程(我使用QThread)。问题是我的函数需要一些变量才能正常工作。 如何使其工作?我展示我所做的
原始代码:
class AnalysisWindow(QtWidgets.QMainWindow):
def __init__(self, firstWindow):
super(AnalysisWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.letsgo)
def letsgo(self):
#here some code , not big
#and at some point i have a heavy one which make it freeze until it's over:
self.x1, self.x2, self.y1,self.y2, self.z, = self.analyze(self.i1, self.i2, self.i3)
def analyze(self,i1,i2,i3):
#big function
return(x1,x2,y1,y2,z)
我尝试的是:
from PyQt5.QtCore import Qt, QThread, pyqtSignal
class AnalysisWindow(QtWidgets.QMainWindow):
class MyThread(QThread):
_signal =pyqtSignal()
def __init__(self):
super().__init__()
def run(self,i1,i2,i3): # here I obviously can't put variables
#I copied here my analyze function
return(x1,x2,y1,y2,z)
self._signal.emit()
def __init__(self, firstWindow):
super(AnalysisWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.letsgo)
def letsgo(self):
self.thread = MyThread()
self.thread.start()
#here I dont see how to send the variables self.i1, self.i2, self.i3 and how to get the result: x1,x2,y1,y2,z
我在QMainWindow类中创建了thread类,因为我需要将一些变量(self.i1、self.i2、self.i3)从QMainWindow传递给将使用新线程的函数。也许这很糟糕,但它根本不起作用。谢谢大家
下面是一个简单的工作示例,您可以根据自己的代码对其进行调整。 需要注意的几件事:
QThread
继承。相反,您应该创建一个辅助线程并将其移动到线程中李>return
一个结果,而是emit
保存结果的信号,并在应用程序中处理该信号李>QtCore.QMetaObject.invokeMethod
通过其插槽与它通信。一旦线程启动,您可以任意调用此方法李>更多信息,请参阅this答案
希望这有帮助
相关问题 更多 >
编程相关推荐