在 tkinter python 中执行("after" 脚本)时如何处理无效的命令名称错误

How to handle Invalid command name error, while executing ("after" script) in tkinter python

我知道这个问题在这里已经被多次提出,我已经逐一解决了。但是我没有找到解决问题的明确方法。我知道发生这个错误的原因。我知道在使用 root.destroy() 之后,还有一些工作需要完成等等。 但我想知道如何停止那些“之后”的工作? 其中一位要求在代码中使用 try/accept。但他没有展示如何使用它。 那么你能为这个案例提供一个明确的解决方案吗?有什么办法可以消除这个错误吗? 我请求您不要将此问题标记为重复,也请不要删除此问题。这很重要,我没有其他来源可以得到我的答案。

invalid command name "2272867821888time"
    while executing
"2272867821888time"
    ("after" script)

在执行使用 after 安排的回调之前销毁 window 时会发生此错误。为避免此类问题,您可以在安排回调时存储返回的 id,并在销毁 window 时将其取消,例如使用 protocol('WM_DELETE_WINDOW', quit_function).

这是一个例子:

import tkinter as tk

def callback():
    global after_id
    var.set(var.get() + 1)
    after_id = root.after(500, callback)

def quit():
    """Cancel all scheduled callbacks and quit."""
    root.after_cancel(after_id)
    root.destroy()

root = tk.Tk()
root.pack_propagate(False)
var = tk.IntVar()
tk.Label(root, textvariable=var).pack()
callback()
root.protocol('WM_DELETE_WINDOW', quit)
root.mainloop()

此外,Tcl/Tk 有一个 after info 方法,该方法不能通过 python 包装器直接访问,但可以使用 root.tk.eval('after info') 和 returns 调用ID 字符串:'id1 id2 id3'。因此,跟踪所有 ID 的另一种方法是使用此方法:

import tkinter as tk

def callback():
    var.set(var.get() + 1)
    root.after(500, callback)

def quit():
    """Cancel all scheduled callbacks and quit."""
    for after_id in root.tk.eval('after info').split():
        root.after_cancel(after_id)
    root.destroy()

root = tk.Tk()
root.pack_propagate(False)
var = tk.IntVar()
tk.Label(root, textvariable=var).pack()
callback()
root.protocol('WM_DELETE_WINDOW', quit)
root.mainloop()