1 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
在執(zhí)行調(diào)度的回調(diào)之前銷毀窗口時(shí)會(huì)發(fā)生此錯(cuò)誤after。為了避免這種問題,您可以存儲(chǔ)調(diào)度回調(diào)時(shí)返回的 id,并在銷毀窗口時(shí)取消它,例如使用protocol('WM_DELETE_WINDOW', quit_function).
這是一個(gè)例子:
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 有一個(gè)after info方法,不能通過 python 包裝器直接訪問,但可以使用調(diào)用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()
添加回答
舉報(bào)