情况:
我是C#/ JS开发者,我是Python的新手。 我正在使用Python 2.7和PyQT 4开发应用程序
在我的主窗口中,我正在调用一个至少需要15秒才能执行的方法。
这个方法阻止了我的主线程,这对我来说是一个问题,因为我想要用户 即使程序正在运行计算,也能够移动窗口。
所以我考虑使用线程,但我希望能够在线程有时得到通知 完成了刷新窗口数据的工作。
如果我在创建的线程中调用一个新函数,它将创建一个新线程 不允许从与主要线程不同的线程修改QT GUI。
问题:
有没有办法启动一个新的Thread(不是一个进程)来运行一个方法并调用另一个方法 过程结束后主线程是什么?
显然,我希望能够与JavaScript中的JavaScript.jQuery.ajax()等效。 Python Environnement。
答案 0 :(得分:3)
您需要使用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()