如何在功能后停止tkinter?

She*_*don 7 python loops tkinter button

我在停止'饲料'方面遇到了问题; 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()
Run Code Online (Sandbox Code Playgroud)

随着输出:

Starting Feed
Sleeping 4195
Sleeping 4634
Sleeping 6591
Sleeping 7074
Stopping Feed
Sleeping 4908
Feed Stopped
Sleeping 6892
Sleeping 5605
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 20

问题是,即使你打电话print_sleepTrue停止周期中,已经是一个悬而未决的工作等待开火.按停止按钮不会导致新作业启动但旧作业仍然存在,当它自己调用时,它会传入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)
Run Code Online (Sandbox Code Playgroud)

注意:确保在self._job某处初始化,例如在应用程序对象的构造函数中.


Edw*_*per 18

当你打电话时root.after(...),它会返回一个标识符.您应该跟踪该标识符(例如,将其存储在实例变量中),然后您可以稍后调用root.after_cancel(after_id)以取消它.

  • 如何获取id? (2认同)