我想用PyQt启动一个线程,它执行一些独立于应用程序其余部分的操作。这包括运行外部程序。这可能需要几分钟的时间。
我的问题是,使用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_())发布于 2019-02-13 06:55:18
QThread不是线程,它是一个线程处理程序。在你的例子中,问题是变量t是局部的,所以在执行start之后它将被删除,此时调用__del__方法,这个方法调用在阻塞图形用户界面的主线程中运行的wait(),这个阻塞它将一直持续到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()https://stackoverflow.com/questions/54659713
复制相似问题