在 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()
我知道这个问题在这里已经被多次提出,我已经逐一解决了。但是我没有找到解决问题的明确方法。我知道发生这个错误的原因。我知道在使用 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()