首页 > 解决方案 > 动态更改 QLabel 文本不起作用

问题描述

我正在尝试使用 QtDesigner、pyqt5 动态更改 QLabel 文本。

下面是我试图用于动态更改 QLabel 文本的代码。

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

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label, 0, QtCore.Qt.AlignHCenter)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "<html><head/><body><p><span style=\" font-size:28pt;\">" + self.getTime() + "</span></p></body></html>"))

    def getTime(self):
        time = QTime.currentTime().toString()
        return time

    def data(self):
        time = QTime.currentTime().toString()
        print("Time: " + time)
        self.label.setText(time)
        return time

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()

    ex = Ui_MainWindow()
    timer = QtCore.QTimer()
    timer.timeout.connect(ex.data)
    timer.start(1000) # 1 Second Refesh Rate

    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

当我尝试在 QtDesigner 中运行代码时,输​​出窗口会打开一秒钟并自动关闭。不确定是什么导致输出窗口关闭。请建议我解决问题。

标签: pythonpyqtpyqt5qt-designerqlabel

解决方案


我建议您在终端/CMD 中执行您的代码,因为许多 IDE 不处理 Qt 错误,如果您这样做,您会收到以下错误:

Traceback (most recent call last):
  File "main.py", line 33, in data
    self.label.setText(time)
AttributeError: 'Ui_MainWindow' object has no attribute 'label

该错误表明标签不存在,这是正确的,因为标签是在调用 setupUi() 之后创建的,但在您的情况下,“ex”没有调用它。一种可能的解决方案是首先创建窗口,然后启动计时器:

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    timer = QtCore.QTimer()
    timer.timeout.connect(ui.data)
    timer.start(1000) # 1 Second Refesh Rate
    sys.exit(app.exec_())

但更好的解决方案是遵循 PyQt (1)的建议,即不应修改 Qt 提供的类,而是将其用作小部件接口:

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


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label, 0, QtCore.Qt.AlignHCenter)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(
            _translate(
                "MainWindow",
                '<html><head/><body><p><span style=" font-size:28pt;"></span></p></body></html>',
            )
        )


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        timer = QtCore.QTimer(self)
        timer.timeout.connect(self.data)
        timer.start(1000)
        self.data()

    def data(self):
        time_str = QTime.currentTime().toString()
        self.label.setText(
            '<html><head/><body><p><span style=" font-size:28pt;">{}</span></p></body></html>'.format(
                time_str
            )
        )


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

(1)使用生成的代码


推荐阅读