QT中建议对UI的操作只能在主线程中,子线程的数据通过信号来发给主线程。
from PySide2.QtWidgets import QApplication,QTextBrowser from PySide2.QtUiTools import QUiLoader from threading import Thread from PySide2.QtCore import Signal,QObject class MySignals(QObject): #定义了一个信号,这个信号发给控件的类型是QTextBrowser,发送的消息类型是str字符串 labeltxt=Signal(QTextBrowser,str) class Calc: def __init__(self): #加载刚才设计的.ui文件 self.ui = QUiLoader().load('D:/vs2019_wf/Calc/Calc/Calc.ui') #define signal instance self.ms=MySignals(); #关联处理该信号的函数 self.ms.labeltxt.connect(self.handleCalc_do) #给ui中的button对象添加clicked事件,触发后执行handleCalc函数, #QT称事件为信号(signal),处理函数为插槽(slot) self.ui.pushButton.clicked.connect(self.handleCalc_th) def handleCalc_th(self): def run(): s1=1*100 #发送信号,2个参数为定义信号时的2种类型 self.ms.labeltxt.emit(self.ui.textBrowser_2,str(s1)) t=Thread(target=run) t.start() #处理函数接收到信号的2个参数,q就是self.ui.textBrowser_2,s就是s1 def handleCalc_do(self,q,s): q.append(str(s)) app = QApplication([]) Calc = Calc() #创建UI,只是一闪而过 Calc.ui.show() #一直循环显示和监听控件 app.exec_()
参考资料:http://www.python3.vip/tut/py/gui/qt_08/