4

情况 :

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

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

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

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

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

问题 :

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

显然,我希望能够与 Python 环境中的 JavaScript.jQuery.ajax() 等效。

4

1 回答 1

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()
于 2013-11-04T16:03:14.203 回答