python qt5线程don';t实时刷新控件

python qt5线程don';t实时刷新控件,python,pyqt5,qthread,Python,Pyqt5,Qthread,我正在使用QT5和python编写一个UI,我添加了一个线程来处理UI,线程工作“很好”,线程中的一个函数接收2个字符串并返回2个字符串(我在开发实际项目之前进行实验,只是为了看看它是如何工作的),正如您在调用线程函数后的代码中所看到的: self.requestConexion.emit('lblText1','dddddd') 我调用另一个函数,它只是一个简单的计数器 self.contador() 所以我希望在计数器完成控件self.lblText1的值更改之前,这不会发生。。。以下是

我正在使用QT5和python编写一个UI,我添加了一个线程来处理UI,线程工作“很好”,线程中的一个函数接收2个字符串并返回2个字符串(我在开发实际项目之前进行实验,只是为了看看它是如何工作的),正如您在调用线程函数后的代码中所看到的:

self.requestConexion.emit('lblText1','dddddd')
我调用另一个函数,它只是一个简单的计数器

self.contador()
所以我希望在计数器完成控件self.lblText1的值更改之前,这不会发生。。。以下是主要代码:

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import UI_test
import time
import sys

class Threaded(QObject):
    result=pyqtSignal(str,str)
    def __init__(self, parent=None, **kwargs):
        super().__init__(parent, **kwargs)

    @pyqtSlot(str,str)
    def etiquetas(self,lbl,texto):
        print(texto)
        self.result.emit(lbl,texto)


class MainApp(QMainWindow, UI_test.Ui_MainWindow):
    requestConexion=pyqtSignal(str,str)
    def __init__(self, parent=None):
        super(MainApp, self).__init__(parent)
        self._thread=QThread()
        self._threaded=Threaded(result=self.displayLabel)
        self.requestConexion.connect(self._threaded.etiquetas)
        self._threaded.moveToThread(self._thread)
        qApp.aboutToQuit.connect(self._thread.quit)
        self._thread.start()
        self.setupUi(self)
        self.btnStart.clicked.connect(self.conexion)

    @pyqtSlot()
    def conexion(self):
        #self._thread.start()
        print(1)
        self.requestConexion.emit('lblText1','dddddd')
        self.contador()
        text, ok = QInputDialog.getText(self, 'Text Input Dialog', 'Enter your name:')
        if ok:
             print(str(text))

    @pyqtSlot()
    def contador(self):
        i=0
        while i<50:
            print(i)
            time.sleep(0.1)
            i+=1

    @pyqtSlot(str,str)
    def displayLabel(self, etiqueta, texto):
        self.lblText1.setText(etiqueta)
        print(texto)


def main():
    app = QApplication(sys.argv)  
    form = MainApp()                 
    form.show()                         
    app.exec_()                         
    exit(app.exec_())

if __name__ == '__main__':              
    main()
从PyQt5.QtCore导入*
从PyQt5.QtWidgets导入*
从PyQt5.QtGui导入*
导入用户界面测试
导入时间
导入系统
类线程化(QObject):
结果=PYQT信号(str,str)
def uuu init uuuu(self,parent=None,**kwargs):
super()。\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
@pyqtSlot(str,str)
定义etiquetas(自我、lbl、文本):
打印(文本)
self.result.emit(lbl,texto)
类MainApp(QMainWindow、UI\u test.UI\u MainWindow):
requestConexion=pyqtSignal(str,str)
def uuu init uuu(self,parent=None):
超级(主应用程序,自我)。\uuuuu初始化\uuuuuuu(父级)
self.\u thread=QThread()
self.\u threaded=threaded(结果=self.displayLabel)
self.requestConexion.connect(self.\u threaded.etiquetas)
自线程。移动到线程(自线程)
qApp.aboutToQuit.connect(self.\u thread.quit)
self.\u thread.start()
self.setupUi(self)
self.btnStart.clicked.connect(self.conexion)
@pyqtSlot()
def conexion(自):
#self.\u thread.start()
印刷品(1)
self.requestConexion.emit('lblText1','dddddddd')
self.contador()
text,ok=QInputDialog.getText(self,'text Input Dialog','Enter your name:')
如果确定:
打印(str(文本))
@pyqtSlot()
def contador(自我):
i=0

我终于在下一篇博客中找到了我问题的答案:

这是一个非常棒的教程,在阅读了博客中的文档后,我能够修改其中一个示例,实时修改标签控件的文本;以下是最终代码:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import time

class Worker(QRunnable):
    def __init__(self, fn, *args, **kwargs):
        super(Worker, self).__init__()        
        self.args = args
        self.kwargs = kwargs
        self.fn = fn

    @pyqtSlot()
    def run(self):
        #print(self.args, self.kwargs)
        print("Thread start") 
        time.sleep(0.2)
        self.fn(*self.args, **self.kwargs)  #ejecuta la funcion recibida


class MainWindow(QMainWindow):


    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        self.threadpool = QThreadPool()
        print("Multithreading with maximum %d threads" % self.threadpool.maxThreadCount())

        self.counter = 0

        layout = QVBoxLayout()

        self.l = QLabel("Start")
        self.l2 = QLabel("xxxxx")
        b = QPushButton("DANGER!")
        b.pressed.connect(self.oh_no)

        layout.addWidget(self.l)
        layout.addWidget(self.l2)
        layout.addWidget(b)

        w = QWidget()
        w.setLayout(layout)

        self.setCentralWidget(w)

        self.show()

        self.etiqueta="rrrrrrrrrr"

        self.timer = QTimer()
        self.timer.setInterval(500)
        self.timer.timeout.connect(self.recurring_timer)
        self.timer.start()

    def oh_no(self):
        self.etiqueta="hhhhhhhhhhhhhhhhh"
        worker = Worker(self.execute_this_fn,'4444')
        self.threadpool.start(worker)

    def recurring_timer(self):
        self.counter +=1
        self.l.setText("Counter: %d" % self.counter)


    def execute_this_fn(self,x):
        print("Hello!")
        self.l2.setText(x)


app = QApplication([])
window = MainWindow()
app.exec_()

GUI不应从另一个线程更新,在您的情况下,您使用的是
self.l2.setText(x)
,这就是信号的用途,因此您可以更好地理解并阅读文档: