Выполнить функцию после завершения потока - PullRequest
1 голос
/ 07 ноября 2019

Итак, у меня есть программа, которая запускает графический интерфейс Qt. Я не хочу публиковать код моей программы, но код, который я показываю, применим к моей. Итак, я получил свой файл с новым потоком.

class MyThread(threading.Thread):
def __init__(self):
    threading.Thread.__init__(self)

def run(self):
    print("Starting Thread")
    time.sleep(5)
    some_method()
    some_method2()
    print("Closing Thread")

И я получил свой main.py

from threadFile import MyThread
t1 = MyThread()
MyThread.start()
self.some_other_method()

Я хочу, чтобы some_other_method () запускался после t1 Тема завершена. Я не могу использовать .join () , потому что он замораживает пользовательский интерфейс, и я не могу включить some_other_method () в threadFile , потому что some_other_method () - это метод экземпляра в моем main.py, а импорт класса в моем threadFile приведет к циклическому импорту. Я надеюсь, что моя проблема ясна.

1 Ответ

1 голос
/ 07 ноября 2019

Затем создайте объект QObject, который излучает законченный сигнал по завершении выполнения задач, и через этот сигнал вызывает нужную функцию:

import threading
import time

from PyQt5 import QtCore, QtWidgets


class Signaller(QtCore.QObject):
    started = QtCore.pyqtSignal()
    finished = QtCore.pyqtSignal()


class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.signaller = Signaller()

    def run(self):
        self.signaller.started.emit()
        print("Starting Thread")
        time.sleep(5)
        print("Closing Thread")
        self.signaller.finished.emit()


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.button = QtWidgets.QPushButton("Press me")
        self.setCentralWidget(self.button)

        self.button.clicked.connect(self.on_clicked)

    @QtCore.pyqtSlot()
    def on_clicked(self):
        self.button.setEnabled(False)
        t1 = MyThread()
        t1.signaller.finished.connect(self.on_finished)
        t1.start()

    @QtCore.pyqtSlot()
    def on_finished(self):
        self.some_other_method()
        self.button.setEnabled(True)

    def some_other_method(self):
        print("test")


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...