我想用PyQt启动一个Thread,它独立于应用程序的其余部分执行一些操作。这包括运行外部程序。这可能需要几分钟时间。
我的问题是使用QThread停止整个应用程序。运行此小程序时,单击该按钮将冻结应用程序10秒钟。
我该怎么做才能使QThread表现为线程。我知道我可以添加一些定时器并将其划分为事件,但这不是我对线程的想法。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtCore import QThread
class ProgramThread(QThread):
def __init__(self):
QThread.__init__(self)
def __del__(self):
self.wait()
def run(self):
QThread.sleep(10)
class App(QWidget):
def __init__(self):
super().__init__()
thread = QPushButton('Start Thread',self)
thread.clicked.connect(self.startthread)
thread.move(20,100)
self.show()
def startthread(self):
t = ProgramThread()
t.start()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
QThread
不是一个线程,它是一个线程处理程序。在你的情况下,问题是变量t是本地的,因此它将在执行启动后被删除,此时调用__del__
方法,并且这调用wait()
在主线程中运行阻塞GUI,这将阻塞它直到run方法完成执行,所以总的来说问题是t是一个局部变量,解决方案是保持它及时,所以有两种可能性:1)将其作为父母传递给self
或2)使其成为一个成员班级:
class ProgramThread(QThread):
def run(self):
QThread.sleep(10)
def __del__(self):
self.wait()
class App(QWidget):
def __init__(self):
super().__init__()
thread = QPushButton('Start Thread',self)
thread.clicked.connect(self.startthread)
thread.move(20,100)
self.show()
def startthread(self):
# method 1
t = ProgramThread(self)
t.start()
# method 2
# self.t = ProgramThread()
# self.t.start()