本帖最后由 冰茶荼 于 2024-9-9 14:27 编辑
不懂py 但是从代码来看 label 组件也触发了销毁事件 看看是否可以在销毁事件中判断来源
经过尝试 给出以下2个解决方案:
方案1:
[Python] 纯文本查看 复制代码 import threading
import time
import tkinter
win = tkinter.Tk()
win.width = 200
win.height = 200
def a():
top = tkinter.Toplevel(win)
top.pack_slaves()
def x():
# 这是子组件,不添加这个子组件时,关闭top窗口只print一次。但是添加时,就会print两次。不pack也会。不使用子线程也会。目前排除线程问题。
la = tkinter.Label(top,text='出现')
la.pack()
def b():
# 使用 top.unbind 来取消剩余事件的触发(触发事件的event不一定是top 是最后一个被添加的组件)
top.unbind('<Destroy>')
top.bind('<Destroy>',b)
t = threading.Thread(target=x)
t.start()
btn = tkinter.Button(win,text='点我',command=a)
btn.pack()
win.mainloop()
方案2:
[Python] 纯文本查看 复制代码 import threading
import time
import tkinter
win = tkinter.Tk()
win.width = 200
win.height = 200
def a():
top = tkinter.Toplevel(win)
top.pack_slaves()
def x():
# 这是子组件,不添加这个子组件时,关闭top窗口只print一次。但是添加时,就会print两次。不pack也会。不使用子线程也会。目前排除线程问题。
la = tkinter.Label(top,text='出现')
la.pack()
def b():
top.destroy()
# 使用窗口关闭协议通信
top.protocol("WM_DELETE_WINDOW", b)
t = threading.Thread(target=x)
t.start()
btn = tkinter.Button(win,text='点我',command=a)
btn.pack()
win.mainloop()
|