gpt4 book ai didi

python - 线程执行完毕后执行函数

转载 作者:行者123 更新时间:2023-12-01 06:57:17 26 4
gpt4 key购买 nike

所以我有一个运行 Qt GUI 的程序。我不想发布我的程序的代码,但我显示的代码适用于我的程序。所以我用一个新线程获取了我的文件。

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() 因为它会卡住 UI,并且我无法在 threadFile 中包含 some_other_method() 因为 some_other_method () 是我的 main.py 中的一个实例方法,在我的 threadFile 中导入该类将产生循环导入。我希望我的问题很清楚。

最佳答案

然后创建一个 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_())

关于python - 线程执行完毕后执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58756486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com