我有关于 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_())
如果您只想让标签实时更新,那么您可以使用
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()