如何在PyQt5中与线程通信并等待结果

时间:2014-11-03 18:29:55

标签: multithreading python-3.x pyqt5

我的程序有问题。 我想创建新线程并启动它,在计算完成后我想将setText设置为带有结果的标签。 我也想要一个停止按钮,这样我就可以停止计算,如果他们花了太长时间。 Unfortunatley它工作不正常,因为在我启动线程后,标签立即更改,并且它不适用于线程完成计算。 这是我的示例代码:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys, random


class MyThread(QThread):
    def __init__(self):
        QThread.__init__(self)
        self.b=1
        self.result=0

    def run(self):
        a=0
        print(self.isRunning())
        while a<self.b and self.isRunning()==True:
            a+=1
        self.result=random.random()

class window(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setObjectName("Dialog")
        self.resize(367, 222)
        self.label = QLabel(self)
        self.label.setText("Test")
        self.label.setGeometry(QRect(30, 20, 311, 121))
        self.pushButton = QPushButton(self)
        self.pushButton2 = QPushButton(self)
        self.pushButton.setGeometry(QRect(150, 170, 75, 23))
        self.pushButton2.setGeometry(QRect(150, 140, 75, 23))
        self.pushButton.setText("Run")
        self.pushButton2.setText("Stop")
        self.pushButton.clicked.connect(self.runner)
        self.pushButton2.clicked.connect(self.stopper)
        self.mythread=MyThread()


    def runner(self):
        self.mythread.b=3000000
        self.mythread.start()
        self.label.setText(str(self.mythread.result))


    def stopper(self):
        self.mythread.terminate()


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    widget = window()
    widget.show()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:1)

好的,我解决了我的问题。 因为self.label.setText(str(self.mythread.result))没有更新结果,因为线程还没有完成,我在myThread中添加了一行,所以它现在看起来像这样

class MyThread(QThread):
def __init__(self):
    super(MyThread, self).__init__()
    self.b=1
    self.result=0
    self.w=window

def run(self):
    a=0
    while a<self.b and self.isRunning()==True:
        a+=1
    self.result=random.random()
    widget.label.setText(str(self.result))

虽然我们仍然可以使用停止按钮停止线程,但结果将在计算完成后设置为文本到标签。