PyQt5中如何与线程通信并等待结果
Posted
技术标签:
【中文标题】PyQt5中如何与线程通信并等待结果【英文标题】:How to communicate with thread in PyQt5 and wait for the result 【发布时间】:2014-11-03 18:29:54 【问题描述】:我的程序有问题。 我想创建新线程并启动它,计算完成后我想将 setText 设置为带有结果的标签。 我还想要一个停止按钮,这样如果计算时间过长,我可以停止计算。 不幸的是,它无法正常工作,因为在我启动线程后,标签会立即更改,并且线程无法完成计算。 这是我的示例代码:
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】:好的,我解决了我的问题。 由于 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))
虽然我们仍然可以使用停止按钮停止线程,但计算完成后,结果将设置为文本标签。
【讨论】:
以上是关于PyQt5中如何与线程通信并等待结果的主要内容,如果未能解决你的问题,请参考以下文章