Python 更新UI PyQt5中的时钟和文本

Python 更新UI PyQt5中的时钟和文本,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,我有一个问题,即在UI运行时如何输入实际时间,文本y也希望在一定时间内更改它。我也尝试在我的例子Reloj.update()中使用MainWindow.update(),但它仍然存在同样的问题,将其与循环放在一起,这是一个坏主意 我将放一些代码,看看它是如何工作的 Ui由QtDesigner生成,然后导出到python。 我的问题是,我有一个用户界面,它显示所有,但它不更新时钟和文本。 我想在UI运行时输入实际时间。 同时,文本在一定时间内也会发生变化。我想在15分钟后更改文本,但在本例中,我设

我有一个问题,即在UI运行时如何输入实际时间,文本y也希望在一定时间内更改它。我也尝试在我的例子Reloj.update()中使用MainWindow.update(),但它仍然存在同样的问题,将其与循环放在一起,这是一个坏主意

我将放一些代码,看看它是如何工作的

Ui由QtDesigner生成,然后导出到python。 我的问题是,我有一个用户界面,它显示所有,但它不更新时钟和文本。 我想在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设计器生成的代码,而是创建另一个从适当的小部件继承的类,并使用初始类填充它

来自itertools导入周期的

从PyQt5导入QtCore、QtGui、QtWidgets
类Ui_Reloj(对象):
def设置UI(自我、重新启动):
Reloj.setObjectName(“Reloj”)
重新旋转。调整大小(400300)
self.centralWidget=qtwidts.QWidget(Reloj)
self.centralWidget.setObjectName(“centralWidget”)
self.gridLayout=qtwidts.QGridLayout(self.centralWidget)
self.gridLayout.setContentsMargins(11,11,11,11)
self.gridLayout.setspace(6)
self.gridLayout.setObjectName(“gridLayout”)
self.Texto=qtwidts.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=qtwidts.QMenuBar(Reloj)
self.menuBar.setGeometry(QtCore.QRect(0,0400,20))
self.menuBar.setObjectName(“menuBar”)
Reloj.setMenuBar(self.menuBar)
self.mainToolBar=qtwidts.QToolBar(Reloj)
self.mainToolBar.setObjectName(“mainToolBar”)
Reloj.addToolBar(QtCore.Qt.toptoolbarea,self.mainToolBar)
self.statusBar=qtwidts.QStatusBar(Reloj)
self.statusBar.setObjectName(“statusBar”)
Reloj.setStatusBar(自我状态栏)
自重传(Reloj)
QtCore.QMetaObject.connectSlotsByName(Reloj)
def重新传输(自我、重新启动):
_translate=QtCore.QCoreApplication.translate
setWindowTitle(_translate(“Reloj”,“Reloj”))
self.Texto.setText(_translate(“Reloj”,“Texto que cambia”))
类主窗口(QtWidgets.QMainWindow,Ui_Reloj):
def uuu init uuu(self,parent=None):
super()。\uuuu init\uuuu(父级)
self.setupUi(self)
timer1=QtCore.QTimer(self,interval=1000,timeout=self.showTime)
timer1.start()
self.showTime()
vec=[“你好”、“好吗?”、“不好”、“天堂”]
self.text=循环(vec)
timer2=QtCore.QTimer(self,interval=15*1000,timeout=self.cambiar\u texto)
timer2.start()
self.cambiar_texto()
@QtCore.pyqtSlot()
def显示时间(自我):
time=QtCore.QTime.currentTime()
text=time.toString(“HH-mm”如果是time.second()%2==0,否则为“HH:mm”)
self.Reloj_2.显示(文本)
@QtCore.pyqtSlot()
def cambiar_texto(自我):
text=next(self.text)
self.Texto.setText(文本)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=主窗口()
w、 show()
sys.exit(app.exec_())