【问题标题】:How to set a command to execute at a certain time, using tkinter如何使用 tkinter 设置在特定时间执行的命令
【发布时间】:2019-05-07 09:39:36
【问题描述】:

我正在使用 Python 制作一个计时器程序。我最终想在 Raspberry Pi 上运行它。这是一项名为'Flyball' 的狗运动。 目前,我的程序使用秒表类以秒显示时间,精确到小数点后 3 位。我可以使用'lap' 按钮触发一个事件,该事件将显示按下单圈按钮时的单圈时间。

我想做的是运行一个'drag tree' of lights'。当我按下“开始”时,我的计时器从 -6.0 秒开始。我的 GUI 上有灯光图像,我希望它们在设定的时间触发:-

-3.0sec, 1st amber light on.
-2.0sec, 2nd amber light on.
-1.0sec, 3rd amber light on.
0.0sec, Green light on.

如果我能做到这一点,那么在灯亮起时添加哔哔声也不会做太多工作。

我认为我需要某种形式的循环来不断检查当前秒表时间并将其与 -3.0 之类的设定时间进行比较。 任何人都可以就如何做这样的事情给我任何建议吗?提前谢谢你。

我可以自己运行灯光树。我使用 time.sleep() 来隔开灯光时间(相隔 1 秒),在全部亮起时将它们打开 3 秒,然后再次关闭。 我通过使用 itemconfig(state = 'normal') 或 itemconfig(state = 'hidden') 来做到这一点 我也使用 tk.after() 得到相同的结果。

如果我在计时器运行时尝试运行此拖动树,计时器显示将由于睡眠功能而停止更新。 如果我用 tk.after() 再试一次,第一个灯会显示,但其余的序列不会完成,除非我按计时器上的“停止”。

我尝试使用 if nextTime == -3.0 类型的条件在命令提示符中触发简单的打印语句,但没有出现任何内容。

这段sn-p代码是秒表类中的Updater函数。它更新了屏幕上显示的时间。我可以使用 self.timer 变量来触发灯光吗?

def 更新程序(自身):

self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)

【问题讨论】:

    标签: tkinter time python-3.7


    【解决方案1】:

    您不能使用sleep,因为它完全按照它所说的那样做:它使整个程序进入睡眠状态。相反,tkinter 小部件有一个名为 after 的方法,可用于在未来运行函数。

    在下面的示例中,我创建了一个函数,它以一秒的间隔打印“哔”,然后是“GO”。

    after 方法接受以毫秒为单位的时间、可调用(例如:对函数的引用)以及零个或多个要传递给该函数的参数。

    def start_tree():
        print("beep")
        root.after(1000, print, "beep")
        root.after(2000, print, "beep")
        root.after(3000, print, "GO!")
    

    意识到对root.after 的调用会立即返回,这一点很重要。它不会等待函数运行。它只是将命令放在队列中,以便 tkinter 在时间过去后尽快运行。

    【讨论】:

    • 感谢您的帮助,布莱恩。使用 after() 语句时,Tkinter 的表现确实好得多。我能够创建一个名为 self.counter 的变量并将 self.totalTime 的值存储到小数点后 3 位。再多,倒计时不起作用。我现在可以访问秒表时间,因为它正在运行以触发事件。我的类和函数还有一些工作要做,但我认为我现在走在正确的轨道上。
    猜你喜欢
    • 2011-04-16
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2018-07-16
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多