PyQt5中QTime调用addSecs后值不更新,求原因及解决办法
QTime计时器不更新的问题原因与修复
问题描述
想要实现一个可显示在屏幕上的简单计时器,使用QTime来记录流逝的时间。但创建初始值为QTime(0, 0, 0)的时间对象后,其值始终保持初始状态不会变化。代码如下:
from PyQt5.QtCore import QTime time = QTime(0, 0, 0) print(time.toString("hh:mm:ss")) # 输出00:00:00 time.addSecs(20) print(time.toString("hh:mm:ss")) # 仍输出00:00:00
原因
QTime是不可变对象,调用addSecs()、addMinutes()这类修改时间的方法时,不会改变原对象的状态,而是返回一个包含修改后时间的新QTime实例。你的代码仅调用了方法但未接收返回值,因此原time变量始终指向初始的时间对象。
修复方法
基础修复:接收返回值
将addSecs()的返回值重新赋值给time变量,即可更新时间:
from PyQt5.QtCore import QTime time = QTime(0, 0, 0) print(time.toString("hh:mm:ss")) # 输出00:00:00 time = time.addSecs(20) # 接收新的QTime实例 print(time.toString("hh:mm:ss")) # 输出00:00:20
实用计时器实现(结合QTimer)
如果要实现屏幕上的动态计时器,通常需要搭配QTimer定期更新时间,示例代码如下:
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QVBoxLayout from PyQt5.QtCore import QTime, QTimer import sys class TimerWindow(QWidget): def __init__(self): super().__init__() self.time = QTime(0, 0, 0) self.label = QLabel(self.time.toString("hh:mm:ss")) layout = QVBoxLayout() layout.addWidget(self.label) self.setLayout(layout) # 每秒触发一次更新 self.timer = QTimer(self) self.timer.timeout.connect(self.update_timer) self.timer.start(1000) def update_timer(self): self.time = self.time.addSecs(1) self.label.setText(self.time.toString("hh:mm:ss")) if __name__ == "__main__": app = QApplication(sys.argv) window = TimerWindow() window.show() sys.exit(app.exec_())
内容的提问来源于stack exchange,提问作者Ceadeus
相关产品推荐
相关产品推荐

