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()
添加回答
舉報