如何使用tkinter设置在特定时间执行的命令

如何使用tkinter设置在特定时间执行的命令,tkinter,time,python-3.7,Tkinter,Time,Python 3.7,我正在用Python制作一个计时器程序。我最终想在树莓皮上运行它。这是一项名为“飞球”的狗运动。 目前,我的程序使用秒表类以秒为单位显示时间,精确到小数点后3位。我可以使用'lap'按钮触发一个事件,该事件将显示按下lap按钮时的圈速 self.totalTime = time.time() - self.startTime self.SetTime(self.totalTime) self.timer = self.after(1,self.Updater) 我想做的是运行一个

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

self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)
我想做的是运行一个由灯光组成的“拖动树”。当我按下“开始”时,计时器开始于-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.
self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)
如果我能让这项工作,它不会有更多的工作,还包括一个嘟嘟声时,灯来了

self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)
我想我需要某种形式的循环来不断检查当前的秒表时间,并将其与设定的时间(如-3.0)进行比较。 有人能给我一些建议吗?先谢谢你

self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)
我可以自己管理光树。我使用time.sleep()来分隔灯光计时(间隔1秒),当所有灯光都亮起时,让它们打开3秒钟,然后再关闭。 我通过使用itemconfig(state='normal')或itemconfig(state='hidden')来实现这一点 我使用tk.after()也得到了相同的结果

self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)
如果我试图在计时器运行时运行此拖动树,计时器显示将由于睡眠功能而停止更新。 如果我用tk.after()再次尝试此操作,第一个指示灯将显示,但除非我按下计时器上的“停止”,否则序列的其余部分将无法完成

self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)
我尝试使用if-nextTime==-3.0类型的条件在命令提示符中触发一个简单的print语句,但没有显示任何内容

self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)
这段代码是stopwatch类中的Updater函数。它更新屏幕上显示的时间。我可以使用self.timer变量触发灯光吗

self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)
def更新程序(自我):

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

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

self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)
在下面的示例中,我创建了一个函数,它以1秒的间隔打印“beep”,然后是“GO”

self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)
after
方法接受以毫秒为单位的时间、可调用(例如:对函数的引用)以及零个或多个传递给该函数的参数

self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)
def start_tree():
    print("beep")
    root.after(1000, print, "beep")
    root.after(2000, print, "beep")
    root.after(3000, print, "GO!")

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

感谢您的帮助Bryan。使用after()语句,Tkinter的表现要好得多。我能够创建一个名为self.counter的变量,并将self.totalTime的值存储到小数点后3位。再这样下去,倒计时就不行了。我现在可以访问秒表时间,因为它正在运行以触发事件。我还有一些关于类和函数的工作要做,但我认为我现在走上了正确的轨道。
self.totalTime = time.time() - self.startTime       
self.SetTime(self.totalTime)
self.timer = self.after(1,self.Updater)