我是PyQt5新手。我编写了以下代码,这些代码在理想情况下应该终止。
from PyQt5.QtCore import QCoreApplication, pyqtSignal, QObject
import sys
import thread
class MainWindow(QObject):
def __init__(self):
super().__init__()
self.myMethod()
def myMethod(self):
self.myThread = thread.MainWindow(self)
self.myThread.threadTerminate.connect(self.finished)
self.myThread.start()
def finished(self, arg1):
print("Message recieved is "+arg1)
QCoreApplication.quit()
if __name__ == '__main__':
qApp = QCoreApplication(sys.argv)
w = MainWindow()
qApp.exec_()
线程代码是:
from PyQt5.QtCore import QThread, QCoreApplication, pyqtSignal
import sys
import time
class MainWindow(QThread):
threadTerminate = pyqtSignal(bool)
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.itsOver = False
def run(self):
print("Hello World!")
time.sleep(3)
print("Alice")
time.sleep(4)
print("Bob")
time.sleep(4)
self.stop()
def stop(self):
print("About to terminate....")
self.itsOver = True
self.threadTerminate.emit(self.itsOver)
self.terminate()
我在做什么错?有什么方法可以跟踪程序的执行流程并知道变量的状态?
答案 0 :(得分:1)
似乎您的比赛条件简单。
当我在对time.sleep(1)
和self.threadTerminate.emit
的调用之间添加self.terminate
时,程序将按预期完成(除了您的print语句(自然不能将str和bool串联))。
在不知道Qt如何处理信号/插槽流的确切细节的情况下,我想说您对terminate
的调用会在调用{{1 }}的线程,从而从事件循环中删除MainWindow
事件,并跳过对finished
的调用。
简而言之:在QThread中执行Quit()
。这是self.exit()
的正常关闭替代方法,据我所知,您应该尽可能避免使用它。
作为旁注,也许需要重新考虑模块和类的命名。 terminate
模块是Python2中的模块,在Python3中重命名为thread
。首先,这让我感到困惑(与上面的评论者相同),因为您有一个名为“ thread.py”的模块。此外,_thread
类似于MainWindow
的名称,而PyQt5.QtWidgets.QMainWindow
没有“窗口”。