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

时间:2013-11-04 14:20:09

标签: python multithreading qt

情况:

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

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

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

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

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

问题:

有没有办法启动一个新的Thread(不是一个进程)来运行一个方法并调用另一个方法 过程结束后主线程是什么?

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

1 个答案:

答案 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()