让after()方法按时运行Tkinter

时间:2017-05-09 16:08:05

标签: python tkinter tkinter-canvas

我正在编写一个工具,必须在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)

问题是它的运行速度比预期慢,我需要知道是否有一种解决方法或某种方式让计时器准确按时运行。 或者也许某种方式使用计算机的时间在屏幕上显示正确的经过时间。 提前谢谢

2 个答案:

答案 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毫秒。而是计算每次调用之间的时间,并添加增量。