外部ウィジェットにバインドされているウィンドウを破棄するときに問題が発生します。
たとえば、1 つのルート ウィンドウと多くの異なるサブウィンドウがあります (コード内では、単純にするために同じものを使用しています)。
ルートからサブウィンドウを開くと。ウィンドウを作成し、ルート ウィンドウからのシグナルにバインドします。すべてのサブウィンドウは、この同じシグナルにバインドされますが、異なるコールバック (サブウィンドウごとに 1 つ) にバインドされます。
次に、このサブウィンドウを破棄すると (上隅の [X] をクリック)、バインドがまだ生きているということは、サブウィンドウがまだ生きていることを意味します。
問題は、バインドされたサブウィンドウを破棄して、他のコールバックを有効にするにはどうすればよいかということです。
subwindow _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()