我在使用Tkinter的python中有一个循环函数,当我使用Tkinter按下按钮时它不会结束。它继续执行按钮指定的新功能,但它继续使用旧功能
这是代码(部分内容):
def countdown(self):
if self.seconds <= 0:
if self.minutes > 0:
self.seconds += 59
self.minutes -= 1
elif self.minutes == 0:
if self.hours != 0:
self.minutes += 59
self.seconds += 59
self.hours -= 1
else:
self.timerLab.configure(text="Times Up!")
self.timerLab.configure(text="Time Remaining: %d:%d:%d " % (self.hours,self.minutes,self.seconds))
self.seconds -= 1
self.after(1000, self.countdown)
那么一旦按下另一个按钮,我该如何结束这个。是否存在结束当前流程的事情?
答案 0 :(得分:1)
Tkinter使用after_cancel()
方法解决了这个问题。您必须存储after
返回的“后标识符”并将其传递给after_cancel
:
def start_countdown(self):
if self.after_id is not None:
self.after_cancel(self.after_id)
self.countdown()
def countdown(self):
# ...
self.after_id = self.after(1000, self.countdown)
答案 1 :(得分:0)
如果您可以通过Ctrl + C停止它,可以使用许多方法来实现它。我不是他们的专家,但是通过谷歌的快速搜索,看起来像这样的东西可以起作用:
import signal
import sys
import subprocess
def signal_handler(signal, frame):
print 'You pressed Ctrl+C!'
sys.exit(0)
还有this解决方案,它在ESC上退出(你只需将27改为另一个密钥的数量来改变它):
import msvcrt
while 1:
print 'Testing..'
# body of the loop ...
if msvcrt.kbhit():
if ord(msvcrt.getch()) == 27:
break
我希望有所帮助。
答案 2 :(得分:0)
有一个设置变量的按钮。让您的倒计时功能检查该变量,并且只有在变量设置为特定值时才重新安排自己。
这样的事情:
def __init__(self):
...
self.running = False
start_button = Button(..., self.start, ...)
quit_button = Button(..., self.stop, ...)
def start(self):
self.running = True;
self.countdown()
def stop(self):
self.running = False;
def countdown(self):
...
if (self.running):
self.after(1000, self.countdown)
答案 3 :(得分:-2)
是否存在结束当前流程的事情
停止当前的主循环并销毁所有小部件;你可以致电root.destroy()
:
#!/usr/bin/env python
import sys
from Tkinter import Tk, Button
def counter(root, n=0):
sys.stderr.write("\r%3s" % n)
root.after(1000, counter, root, n + 1)
root = Tk()
Button(root, text="Quit", command=root.destroy).pack()
counter(root)
root.mainloop()