gpt4 book ai didi

python - 在 PyQT 应用程序的主线程中使用回调方法在 Python 中启动一个新线程

转载 作者:太空宇宙 更新时间:2023-11-03 11:05:55 30 4
gpt4 key购买 nike

情况:

我是 C#/JS 开发人员,我是 Python 的新手。我正在使用 Python 2.7 和 PyQT 4 开发应用程序

在我的主窗口中,我正在调用一个至少需要 15 秒才能执行的方法。

这个方法阻塞了我的主线程,这对我来说是个问题,因为我想要用户即使程序正在运行计算也能够移动窗口。

所以我考虑过使用线程,但我希望能够在线程发生时得到通知完成刷新窗口数据的工作。

如果我在创建的线程中调用一个新函数,它会创建一个新线程并且它不允许从与主线程不同的线程修改 QT GUI。

问题:

有没有办法启动一个新的线程(不是进程),它将运行一个方法并从中调用另一个方法进程结束后的主线程?

显然,我希望能够与 JavaScript.jQuery.ajax() 在Python 环境。

最佳答案

您需要使用QThread 以及信号和槽。 QThread 继承自 QObject,它允许发出信号。

任务完成后,QThread 会发出一个finished() 信号

编辑

如果你像这样定义一个自定义线程:

class CustomThread(QtCore.QThread):
def __init__(self, target, slotOnFinished=None):
super(CustomThread, self).__init__()
self.target = target
if slotOnFinished:
self.finished.connect(slotOnFinished)

def run(self, *args, **kwargs):
self.target(*args, **kwargs)

您将能够:

class MyCustomWidget(QtGui.QWidget):

def __init__(self, parent=None):
super(MyCustomWidget, self).__init__(parent)
layout = QtGui.QVBoxLayout(self)
button = QtGui.QPushButton("Start", self)
layout.addWidget(button)
button.clicked.connect(self.onStart)
self.actionthread = CustomThread(target=self.longAction, self.onFinished)

def onFinished(self):
# Do Something

def longAction(self):
time.sleep(3)

def onStart(self):
self.actionthread.start()

关于python - 在 PyQT 应用程序的主线程中使用回调方法在 Python 中启动一个新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19769710/

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