1 回答
TA贡献1811条经验 获得超5个赞
在执行调度的回调之前销毁窗口时会发生此错误after。为了避免这种问题,您可以存储调度回调时返回的 id,并在销毁窗口时取消它,例如使用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')并返回 ids: 字符串'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()
添加回答
举报