Python QThread停止事件处理

Python QThread停止事件处理,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我想用PyQt启动一个线程,它独立于应用程序的其余部分执行一些操作。这包括运行外部程序。这可能需要几分钟 我的问题是,使用QThread执行此操作会停止整个应用程序。 运行此小程序时,单击按钮将冻结应用程序10秒钟 如何使QThread作为线程运行。我知道我可以添加一些计时器并将其划分为事件,但这不是我对线程的想法 import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton from PyQt5.QtCore

我想用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_())
QThread不是线程,它是线程处理程序。在您的例子中,问题是变量t是本地的,因此在执行start之后它将被删除,此时调用_del_________________________________________________,解决方案是及时保存它,因此有2种可能性: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()

将t=ProgramThread更改为self.t=ProgramThread,并将t.start更改为self.t.start感谢您清除此详细信息。现在它就像一个符咒。