我在输入UI运行时的实际时间时遇到问题,文本y想要在特定时间段内进行更改。我还尝试在我的情况下使用MainWindow.update()Reloj.update(),但是它仍然存在相同的问题,将其放入循环中是一个坏主意。
我将放一些代码只是为了看看它是如何工作的
Ui由QtDesigner制作,然后导出到python。我的问题是我有一个可以显示所有内容的UI,但它不会更新时钟和文本。我想输入UI运行时的实际时间。文本也将在一定时间内更改。我想在15分钟后更改文本,但是在这种情况下,我将“延迟”设置为15秒,而Ui不变。
我也尝试使用Reloj.update()更新Ui,但是它也没有改变。
这是示例:
from PyQt5 import QtCore, QtGui, QtWidgets import time class Ui_Reloj(object): def setupUi(self, Reloj): Reloj.setObjectName("Reloj") Reloj.resize(400, 300) self.centralWidget = QtWidgets.QWidget(Reloj) self.centralWidget.setObjectName("centralWidget") self.gridLayout = QtWidgets.QGridLayout(self.centralWidget) self.gridLayout.setContentsMargins(11, 11, 11, 11) self.gridLayout.setSpacing(6) self.gridLayout.setObjectName("gridLayout") self.Texto = QtWidgets.QLabel(self.centralWidget) self.Texto.setObjectName("Texto") self.gridLayout.addWidget(self.Texto, 0, 0, 1, 1) self.Reloj_2 = QtWidgets.QLCDNumber(self.centralWidget) self.Reloj_2.setObjectName("Reloj_2") self.gridLayout.addWidget(self.Reloj_2, 0, 1, 1, 1) Reloj.setCentralWidget(self.centralWidget) self.menuBar = QtWidgets.QMenuBar(Reloj) self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 20)) self.menuBar.setObjectName("menuBar") Reloj.setMenuBar(self.menuBar) self.mainToolBar = QtWidgets.QToolBar(Reloj) self.mainToolBar.setObjectName("mainToolBar") Reloj.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar) self.statusBar = QtWidgets.QStatusBar(Reloj) self.statusBar.setObjectName("statusBar") Reloj.setStatusBar(self.statusBar) self.retranslateUi(Reloj) QtCore.QMetaObject.connectSlotsByName(Reloj) """ Reloj """ time = QtCore.QTime.currentTime() texto_reloj = time.toString('HH:mm') if (time.second() % 2) == 0: texto_reloj = texto_reloj[:2] + ' ' + texto_reloj[3:] self.Reloj_2.display(texto_reloj) """ Texto que Cambia """ vec = ['Hola','Que Tal?', 'No se toca', 'paradise'] self.cambiar_texto(vec) def retranslateUi(self, Reloj): _translate = QtCore.QCoreApplication.translate Reloj.setWindowTitle(_translate("Reloj", "Reloj")) self.Texto.setText(_translate("Reloj", "Texto que cambia")) def showTime(self): time = QtCore.QTime.currentTime() text = time.toString('HH:mm') if (time.second() % 2) == 0: text = text[:2] + ' ' + text[3:] self.Reloj_2.display(text) """ Cambiar Texto cada X tiempo (ejemplo 15 Minutos) """ def cambiar_texto (self,vec): i=0 length_string = len(vec) time.sleep(15) self.Texto.setText(vec[i]) if (i == 3): i=0 else: i+=1 if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) Reloj = QtWidgets.QMainWindow() ui = Ui_Reloj() ui.setupUi(Reloj) Reloj.show() sys.exit(app.exec_())
编译时没有错误,但是应该更新时钟和文本。
您不应在主GUI线程中使用time.sleep(),因为它会阻塞事件循环,而应使用QTimer。另一方面,不要修改Qt Designer生成的代码,而是创建另一个从适当的小部件继承的类,并使用初始类来填充它。
from itertools import cycle from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Reloj(object): def setupUi(self, Reloj): Reloj.setObjectName("Reloj") Reloj.resize(400, 300) self.centralWidget = QtWidgets.QWidget(Reloj) self.centralWidget.setObjectName("centralWidget") self.gridLayout = QtWidgets.QGridLayout(self.centralWidget) self.gridLayout.setContentsMargins(11, 11, 11, 11) self.gridLayout.setSpacing(6) self.gridLayout.setObjectName("gridLayout") self.Texto = QtWidgets.QLabel(self.centralWidget) self.Texto.setObjectName("Texto") self.gridLayout.addWidget(self.Texto, 0, 0, 1, 1) self.Reloj_2 = QtWidgets.QLCDNumber(self.centralWidget) self.Reloj_2.setObjectName("Reloj_2") self.gridLayout.addWidget(self.Reloj_2, 0, 1, 1, 1) Reloj.setCentralWidget(self.centralWidget) self.menuBar = QtWidgets.QMenuBar(Reloj) self.menuBar.setGeometry(QtCore.QRect(0, 0, 400, 20)) self.menuBar.setObjectName("menuBar") Reloj.setMenuBar(self.menuBar) self.mainToolBar = QtWidgets.QToolBar(Reloj) self.mainToolBar.setObjectName("mainToolBar") Reloj.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar) self.statusBar = QtWidgets.QStatusBar(Reloj) self.statusBar.setObjectName("statusBar") Reloj.setStatusBar(self.statusBar) self.retranslateUi(Reloj) QtCore.QMetaObject.connectSlotsByName(Reloj) def retranslateUi(self, Reloj): _translate = QtCore.QCoreApplication.translate Reloj.setWindowTitle(_translate("Reloj", "Reloj")) self.Texto.setText(_translate("Reloj", "Texto que cambia")) class MainWindow(QtWidgets.QMainWindow, Ui_Reloj): def __init__(self, parent=None): super().__init__(parent) self.setupUi(self) timer1 = QtCore.QTimer(self, interval=1000, timeout=self.showTime) timer1.start() self.showTime() vec = ["Hola", "Que Tal?", "No se toca", "paradise"] self.texts = cycle(vec) timer2 = QtCore.QTimer(self, interval=15 * 1000, timeout=self.cambiar_texto) timer2.start() self.cambiar_texto() @QtCore.pyqtSlot() def showTime(self): time = QtCore.QTime.currentTime() text = time.toString("HH mm" if time.second() % 2 == 0 else "HH:mm") self.Reloj_2.display(text) @QtCore.pyqtSlot() def cambiar_texto(self): text = next(self.texts) self.Texto.setText(text) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) w = MainWindow() w.show() sys.exit(app.exec_())