销毁绑定到外部小部件的窗口时遇到问题。
例如,我有一个根窗口,和许多不同的子窗口(在代码中是相同的,以使其简单)。
当我从根目录打开子窗口时。它创建一个窗口并绑定到来自根窗口的信号。所有子窗口都将绑定到同一个信号,但绑定到不同的回调(每个子窗口一个)。
然后,当我销毁这个子窗口(单击右上角的 X)时,绑定仍然存在,这意味着子窗口仍然存在。
问题是:如何使用绑定销毁子窗口,让其他回调保持活动状态?
在子窗口 _destroy 方法中,我尝试过
root.unbind("<<EverybodyDoSomething>>", self.bind1)
但我得到一个错误
TclError: 无法删除 Tcl 命令
如果我使用
root.unbind("<<EverybodyDoSomething>>")
所有与信号相关的回调都被解除绑定。
import Tkinter as Tk
root = Tk.Tk()
i_window = 0
def generate_dosomething_signal():
root.event_generate('<<EverybodyDoSomething>>', when = 'tail')
def subwindow():
SubWindow()
class SubWindow(Tk.Tk):
def __init__(self):
global i_window
Tk.Tk.__init__(self)
self.i = str(i_window)
i_window += 1
l = Tk.Label(master=self, text='This is s Sub Window %s!!!!'%self.i)
l.pack()
self.bind1 = root.bind('<<EverybodyDoSomething>>',
self.callback_from_sub_window, '+')
self.bind('<Destroy>', self._destroy)
def _destroy(self, *args):
# root.unbind('<<EverybodyDoSomething>>', self.bind1)
# root.unbind('<<EverybodyDoSomething>>')
pass
def callback_from_sub_window(self, *args):
print 'callback from Sub Window ' + self.i
bStartWindow = Tk.Button(master=root, text='Start Sub Window', command=subwindow)
bStartWindow.pack()
bDoSomethingEverywhere = Tk.Button(master=root, text='Do something everywhere',
command = generate_dosomething_signal)
bDoSomethingEverywhere.pack()
root.mainloop()