繁体   English   中英

让after()方法按时运行Tkinter

[英]Have after() method run on time Tkinter

我正在编程一个工具,该工具必须使用python在Tkinter中显示精度为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)

问题是它的运行速度比预期的慢,我需要知道是否存在解决方法或某种方式使计时器准确地按时运行。 或者,可以使用某种方式使用计算机的时间在屏幕上显示正确的经过时间。 先感谢您

最准确的方法可能是找到开始时间,然后每次调用更新计时器功能时,只需从当前时间中减去开始时间即可。

我附加了一些示例代码,向您大致展示了它的工作方式。 使它适应Tkinter after()应该很简单。

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();

小提琴示例: https : //repl.it/Hoqh/0

after命令不作任何保证,除非它不会在给定时间段之前执行。 Tkinter不是实时系统。

您还必须考虑执行代码所需的时间。 例如,假设您的命令正好按时启动。 在该代码中,您有两行代码:

self.timer += 0.01
self.timerLabel.configure(text="%.2f" % self.timer)

该代码需要花费一些时间才能执行。 可能只有几微秒,但绝对超过零微秒。

然后调用after再次:

self.timerLabel.after(10, self.update_timer)

下次运行将在当前时间之后至少10毫秒,这是调用后的几微秒或毫秒。 因此,如果前两个命令花费1毫秒,那么下次调用时将是第一次调用之后的11毫秒(延迟为10毫秒,执行代码为1毫秒)

你可以通过调用最小化延迟因素一点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必须先处理重绘,然后才能处理计划的任务。

如果要考虑所有这些漂移,不要每次都自动增加10ms。 而是,计算每次调用之间的时间,并添加增量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM