我正在编写一个工具,必须在Tkinter和python中以1/100秒的精度显示一个计时器。我已尝试将after()
方法与self.timerLabel.after(0, self.update_timer)
def update_timer (self):
self.timer += 0.01
self.timerLabel.configure(text="%.2f" % self.timer)
self.timerLabel.after(10, self.update_timer)
问题是它的运行速度比预期慢,我需要知道是否有一种解决方法或某种方式让计时器准确按时运行。 或者也许某种方式使用计算机的时间在屏幕上显示正确的经过时间。 提前谢谢
答案 0 :(得分:1)
最准确的方法可能是找到开始时间,然后每次调用更新计时器功能时,只需从当前时间减去开始时间。
我附上了一些示例代码,大致向您展示它的工作原理。将after()
Tkinter
用于import time
# Start time
startTime = time.time();
def update_timer():
# Find difference and print
timeDifference = time.time() - startTime;
print(timeDifference);
# Sleep appropriate amount of time before printing
# next statement.
time.sleep(0.1);
# Recursively call update.
update_timer();
# Start running
update_timer();
是非常简单的。
@Cacheable({"users"})
public User getUser(String userId) {
// Logic goes here
}
示例小提琴:https://repl.it/Hoqh/0
答案 1 :(得分:0)
after
命令不做任何保证,除了它在给定时间段之前不会执行。 Tkinter不是一个实时系统。
您还必须考虑执行代码所需的时间。例如,假设您的命令准确按时开始。在该代码中,您有两行代码:
self.timer += 0.01
self.timerLabel.configure(text="%.2f" % self.timer)
该代码需要一些时间来执行。它可能只有几微秒,但肯定超过零微秒。
然后再次致电after
:
self.timerLabel.after(10, self.update_timer)
下一次运行将在当前时间之后至少10 ms,这是在调用之后的几微秒或几毫秒。因此,如果前两个命令需要1ms,那么下次调用它将在第一次调用后11 ms(延迟10ms,加上代码执行1ms)
通过立即调用after
,您可以稍微减少延迟因素,而不是等待其余代码执行。只要延迟大于执行其他代码所需的时间,您就会发现略有改进:
def update_timer (self):
self.timerLabel.after(10, self.update_timer)
self.timer += 0.01
self.timerLabel.configure(text="%.2f" % self.timer)
这仍然不准确,因为还有其他事情可以阻止self.timer在被请求后正好被调用10ms。例如,如果窗口调整大小或以9.99ms移动,则tkinter必须处理重绘才能处理计划任务。
如果您想要考虑所有这些漂移,请不要每次自动增加10毫秒。而是计算每次调用之间的时间,并添加增量。