銷燬綁定到外部窗口小部件的窗口時出現問題。破壞後綁定活着
例如,我有一個根窗口和許多不同的子窗口(在代碼中是簡單的)。
當我從根打開子窗口。 它創建一個窗口並綁定到來自根窗口的信號。 所有的子窗口都會綁定到這個相同的信號,但不同的回調(每個子窗口一個)。
然後,當我銷燬這個子窗口(點擊頂角的X)時,綁定仍然存在,這意味着子窗口仍然存在。
現在的問題是: 如何使用其綁定來銷燬子窗口,讓其他回調活着?
在子窗口_destroy方法,我都試過
root.unbind("<<EverybodyDoSomething>>", self.bind1)
,但我得到一個錯誤
TclError: can't delete Tcl command
如果我用
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()
感謝您的信息,我不知道Toplevel(Tkinter新手),但是在Tk改換Toplevel後,問題依然存在。創建一個或多個子窗口後,如果關閉它們,「do something button」不應該做任何事情,但它仍會調用被銷燬的子窗口的回調。 – fariza
爲了澄清,我想要的是子窗口和它們的回調被銷燬,而不是根窗口。 – fariza
@fariza:我已經更新了我的答案。簡短的回答:你不能像你這樣去除綁定。你需要改變你的架構。 –