我在停止'饲料'方面遇到了问题; cancel参数似乎对after方法没有任何影响。虽然“停止进给”会打印到控制台。
我正在尝试使用一个启动Feed的按钮和另一个停止Feed的按钮。
from Tkinter import Tk, Button
import random
def goodbye_world():
print "Stopping Feed"
button.configure(text = "Start Feed", command=hello_world)
print_sleep(True)
def hello_world():
print "Starting Feed"
button.configure(text = "Stop Feed", command=goodbye_world)
print_sleep()
def print_sleep(cancel=False):
if cancel==False:
foo = random.randint(4000,7500)
print "Sleeping", foo
root.after(foo,print_sleep)
else:
print "Feed Stopped"
root = Tk()
button = Button(root, text="Start Feed", command=hello_world)
button.pack()
root.mainloop()
输出:
Starting Feed
Sleeping 4195
Sleeping 4634
Sleeping 6591
Sleeping 7074
Stopping Feed
Sleeping 4908
Feed Stopped
Sleeping 6892
Sleeping 5605
答案 0 :(得分:18)
问题在于,即使您使用print_sleep
调用True
来停止循环,也已有等待启动的待处理作业。按下停止按钮不会导致新作业被触发,但是旧作业仍在那里,当它自己调用时,它会传入False,这会导致循环继续。
您需要取消挂起的作业,以便它不会运行。例如:
def cancel():
if self._job is not None:
root.after_cancel(self._job)
self._job = None
def goodbye_world():
print "Stopping Feed"
cancel()
button.configure(text = "Start Feed", command=hello_world)
def hello_world():
print "Starting Feed"
button.configure(text = "Stop Feed", command=goodbye_world)
print_sleep()
def print_sleep():
foo = random.randint(4000,7500)
print "Sleeping", foo
self._job = root.after(foo,print_sleep)
注意:确保在某处初始化self._job
,例如在应用程序对象的构造函数中。
答案 1 :(得分:16)
当您致电root.after(...)
时,它会返回一个标识符。您应该跟踪该标识符(例如,将其存储在实例变量中),然后您可以稍后调用root.after_cancel(after_id)
取消它。