当GUI退出时终止QThread

时间:2019-05-17 21:56:03

标签: python python-3.x pyqt pyqt5 qthread

我正在使用QThreads在后台运行一个函数,但是当我退出GUI应用程序时,QThread仍然继续运行。

有一些有关C ++的示例,但我不知道如何在python中实现它们

class PF35Thread(QtCore.QThread):
    signalPF35 = pyqtSignal()
    def __init__(self, parent = None):
        super().__init__(parent)
    def run(self):
        newcase = newcaseList[-1]
        os.system('EAZ{0}(3,5).EAZ{0}(3,5).OUT'.format(newcase))
        self.signalPF35.emit()

如何在GUI关闭时终止QThread?

1 个答案:

答案 0 :(得分:1)

我认为在您的情况下,仅由于os.system()被阻塞,才需要线程,但是如果您使用QProcess,它将执行类似的任务,并且您不需要线程,因此还可以通过Qt eventloop轻松管理

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    signalPF35 = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        button = QtWidgets.QPushButton("Start task", clicked=self.on_clicked)
        self.setCentralWidget(button)
        self._process = QtCore.QProcess(self)
        self._process.finished.connect(self.on_finished)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        newcase = newcaseList[-1]
        self._process.start('EAZ{0}(3,5).EAZ{0}(3,5).OUT'.format(newcase))

    @QtCore.pyqtSlot()
    def on_finished(self):
        self.signalPF35.emit()

    def closeEvent(self, event):
        self._process.kill()
        super(MainWindow, self).closeEvent(event)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())