我一直在开发一个带有 UI 的秒表项目。我使用 TKinter 中的新手技能构建了 UI。我正在尝试找到一种方法来更改标签文本,该文本每秒打印新时间。
我的第一个想法是每次文本应该更改时重新加载框架并重新打包并将其运行到主循环。有没有办法做到这一点,或者有其他方法可以实现这一目标?
我尝试使用以下代码来做到这一点:
import tkinter as tk
import time as t
hour = 0
minute = 0
second = 0
ptime = [hour, minute, second]
time = ':'.join(ptime)
window = tk.Tk()
window.title("Stopwatch")
###window.minsize(250,250)
###window.maxsize(500,500)
window.resizable(False, False)
window.geometry("250x120")
window.attributes('-topmost', 1)
window.iconbitmap("clock.ico")
timeLabel = tk.Label(window, text = time, font = (None, 40))
running = False
def resetf():
print("Stopwatch Resetting")
ptime = [str(0), str(0), str(0)]
time = ':'.join(ptime)
timeLabel.config(text = time)
timeLabel.pack()
print("Stopwatch Reset")
def tgl():
global running
if running:
print("Stopwatch Ending")
print(running)
running = False
print(running)
print("Stopwatch Not Running")
elif not running:
print("Stopwatch Starting")
print(running)
running = True
print(running)
print("Stopwatch Running")
startstop = tk.Button(window, text = "Start/Stop", command = tgl)
startstop.config(width = 250)
reset = tk.Button(window, text = "Reset", command = resetf)
reset.config(width = 250)
timeLabel.pack()
startstop.pack()
reset.pack()
window.mainloop()
while running:
t.sleep(1)
second = second + 1
if second == 60:
minute += 1
second = 0
if minute == 60:
hour += 1
ptime = [str(hour), str(minute), str(second)]
time = ':'.join(ptime)
timeLabel.config(text = time)
timeLabel.pack()
window.mainloop()
这是我到目前为止的全部代码。我应该更改什么才能使标签的文本每秒发生变化?
嗯,实际上标签不是为了这个目的而设计的。
您应该使用文本小部件。它的行为与 Label 非常相似,但您将能够轻松替换它每秒显示的文本。
你计算每秒的方法确实不准确。一段时间后你就会得到时间流逝。
更好的方法是使用时间库读取一些开始时间,然后每秒检查 100 次,您应该根据开始时间和当前时间之间的变化更新显示的时间。
这样,您将不会获得时间滑动,直到进程或系统时间没有明显的时间滑动(取决于您使用的时间函数),并且当前显示时间的精度约为 0.01 秒或更高,如果显示,您将更频繁地检查值需要更新。 当然可能有一些更好的解决方案,也许有一些现成的库。