Как заставить дочерний поток закрыться, когда главное окно GUI закрыто в pyqt5 / python 3? - PullRequest
0 голосов
/ 11 апреля 2020

Я пишу GUI, используя pyqt5 (Python 3.6). Я пытаюсь запустить другой поток параллельно основной GUI. Я бы хотел, чтобы этот дочерний поток завершался при закрытии основного приложения. В этом примере дочерний поток является простым счетчиком. Когда я закрываю основной GUI, счетчик продолжает работать. Как я могу завершить поток, когда окно GUI закрыто? В реальном случае у меня может быть поток, который выполняет операции, выполнение которых занимает несколько минут. Я не хочу использовать флаг в потоке, чтобы оценить, должен ли он закончиться, потому что может потребоваться несколько минут, чтобы закрыть поток после закрытия окна GUI. Я бы предпочел, чтобы нить закончилась прямо сейчас. Какие-либо предложения? Спасибо.

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import (QWidget, QApplication,QPushButton, 
                             QVBoxLayout)
import time, threading, sys

class testScriptApp(QtWidgets.QWidget):

    def __init__(self, parent=None):
        # initialize th widget
        QtWidgets.QWidget.__init__(self, parent)
        # set the window title
        self.setWindowTitle("Scripting")
        # manage the layout
        self.mainGrid = QVBoxLayout()
        self.button = QPushButton('Start')
        self.button.clicked.connect(self.on_click)
        self.mainGrid.addWidget(self.button)
        self.setLayout(self.mainGrid)

    def on_click(self):
        self.worker = threading.Thread(target=Worker)
        self.worker.daemon = True
        self.worker.start()

def Worker(count=1):
    while count>0:
        print(count)
        time.sleep(2)
        count+=1

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myapp = testScriptApp()
    myapp.show()
    app.exec_()

1 Ответ

0 голосов
/ 11 апреля 2020

Я пытался использовать QThread, но это блокирует основной GUI. Я не уверен, правильно ли я его реализую.

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import (QWidget, QApplication,QPushButton, 
                             QVBoxLayout)
from PyQt5.QtCore import QThread
import time, threading, sys

class testScriptApp(QtWidgets.QWidget):

    def __init__(self, parent=None):
        # initialize th widget
        QtWidgets.QWidget.__init__(self, parent)
        # set the window title
        self.setWindowTitle("Scripting")
        # manage the layout
        self.mainGrid = QVBoxLayout()
        self.button = QPushButton('Start')
        self.button.clicked.connect(self.on_click)
        self.mainGrid.addWidget(self.button)
        self.setLayout(self.mainGrid)

    def on_click(self):
        self.worker = Worker()
        self.worker.run()

    def closeEvent(self,event):
        print('Closing')
        self.worker.terminate()
        event.accept()

class Worker(QThread):

    def __init__(self):
        QThread.__init__(self)

    def run(self):
        count=1
        while count>0:
            print(count)
            time.sleep(2)
            count+=1

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myapp = testScriptApp()
    myapp.show()
    app.exec_()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...