如何在函数执行后停止 tkinter?

2024-05-17

我在停止“提要”时遇到问题; cancel 参数似乎对 after 方法没有任何影响。尽管“feed stop”被打印到控制台。

我正在尝试使用一个按钮来启动源,另一个按钮来停止源。

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

问题是,即使你打电话print_sleep with 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某处,例如在应用程序对象的构造函数中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在函数执行后停止 tkinter? 的相关文章

随机推荐