python Qlabel 文本没有按我的预期更新

问题描述 投票:0回答:1

我有关于 Qlabel 的问题。 以下是代码示例。在运行程序时,我想显示系统正在运行的消息。 但不知何故,Qlabel 消息没有按我的预期更新。 “self.text_label.setText('正在读取文件……')”以下代码区域。 (这没有按预期显示)

最后 Qlabel 文本已更新。 “self.text_label.setText('操作完成')“区域
(这如预期所示)

如有错误或遗漏,请指教。

import  os , sys, time
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import (QMainWindow, QVBoxLayout,QHBoxLayout,
     QApplication,QPushButton,QWidget,QRadioButton,QLabel,QTextEdit)  
class Main(QMainWindow):
    def __init__(self):
        super().__init__()

        #overall layout
        layout = QVBoxLayout()
                
        # Pushbutton for excution         
        bt_layout = QtWidgets.QGridLayout()
        bt_layout.setContentsMargins(0,0,0,20)
        start_bt = QPushButton("start")
        start_bt.setStyleSheet("background-color:lightblue")        
        bt_layout.addWidget(start_bt)
        start_bt.clicked.connect(self.start)
        layout.addLayout(bt_layout)
 
        text_layout = QHBoxLayout()
        self.text_label = QLabel()
        self.text_label.setText('before operation') 
        text_layout.addWidget(self.text_label)                    
        layout.addLayout(text_layout)

        #overall layout        
        self.container = QWidget()
        self.container.setLayout(layout)
        self.setCentralWidget(self.container)               
        self.setGeometry(500, 100, 330, 200)
        self.show()
    
    def start(self):
        self.text_label.setText('reading file ......')   
        time.sleep(5)
            
        self.text_label.setText('opertaion finish')   
        self.text_label.setStyleSheet("background-color:#00FF00 ")        
        
# call the main() function.
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())
python pyqt qlabel
1个回答
0
投票

如果您只想让标签实时更新,那么您可以使用

QTimer
,它是
singleShot
类方法,一旦预设的时间完全过去,就会触发更新。

例如,您可以在将标签文本设置为“正在读取文件......”后调用

QTimer.singleShot
方法中的
start
,并将回调设置为执行其余标签更新的另一个方法5秒后。

...
from PyQt5 import QtCore
...

...
...

    def start(self):
        self.text_label.setText('reading file ......')
        QtCore.QTimer().singleShot(5000, self.updateLabel)

    def updateLabel(self):
        self.text_label.setText('operation finish')
        self.text_label.setStyleSheet("background-color:#00FF00 ")

如果您实际上要打开一个需要 5 秒才能读取的文件,这不会有太大帮助。如果是这种情况,那么您可能希望在不同的线程中执行该操作,然后在线程完成读取后传递读取的数据。

例如:


class ReadThread(QThread):
    fileRead = Signal(str)

    def __init__(self, filename):
        super().__init__()
        self.filename = filename

    def run(self):
        with open(self.filename) as file:
            data = file.read()
        self.fileRead.emit(data)
        

class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        ...
        ...

    def updateLabel(self, data):
        ... do something with data
        self.text_label.setText('operation finish')
        self.text_label.setStyleSheet("background-color:#00FF00 ")


    def start(self):
        self.text_label.setText('reading file ......')
        self.thread = ReadThread(filename)
        self.thread.fileRead.connect(self.updateLabel)
        self.thread.start()
© www.soinside.com 2019 - 2024. All rights reserved.