2009-07-29 6 views
1

私はTkinterで小さなアプリケーションを作っています。私はウィンドウが閉じられたときに呼び出される関数でいくつかのものをきれいにしたいと思います。私はクローズイベントをその機能でバインドしようとしています。それが可能なのかどうか、対応するシーケンスは何か分かりません。Tkinterフレームにどのイベントをバインドできますか?

Pythonのドキュメントには、See the bind man page and page 201 of John Ousterhout’s book for detailsと記載されています。

残念ながら、私はこれらのリソースを私の手には持っていません。誰かがバインドできるイベントのリストを知っていますか?

代替方法として、Frameクラスの__del__のすべてをクリーニングする方法があります。知られていない理由のために、決して呼び出されないようです。何が原因なのか誰も知っていますか?いくつかの循環依存関係?

すぐに、コントロール(以下のコードでコメントを外します)を追加すると、__del__はもう呼び出されません。その問題の解決策はありますか?私は信じていthis

from tkinter import * 

class MyDialog(Frame): 
    def __init__(self): 
     print("hello") 
     self.root = Tk() 
     self.root.title("Test") 

     Frame.__init__(self, self.root) 
     self.list = Listbox(self, selectmode=BROWSE) 
     self.list.pack(fill=BOTH, expand=1) 
     self.pack(fill=BOTH, expand=1) 


    def __del__(self): 
     print("bye-bye") 

dialog = MyDialog() 
dialog.root.mainloop() 

答えて

3

は、あなたが探していたかもしれないバインドのmanページです。私はバインドしようとしているイベントがDestroyだと思います。 __del__は頼りにはいけません(親と子の間のウィジェットや循環などの循環参照ループがトリガーを止めるのは非常に困難です)、イベントバインディングを使用することが確実です。

+0

これは完全に機能します。どうもありがとうございました。私は、循環参考文献がニグメアであることに同意する。 – luc

+1

manページへのリンクがprincetonの個人アカウントではない場合、これがより良い答えになると思います。 tcl.tk/manには公式のマニュアルページがあります。 –

+0

@ブライアン良い点、それに応じてURLを変更しました。 –

3

イベントの詳細なリソースはbind man page for Tkです。私はあなたが何をしたいのかはっきりとはっきりしていませんが、"<Destroy>"にバインドするのはおそらくあなたが探しているイベントです。本当に必要なことをするかどうかはわかりません。

... 
self.bind("<Destroy>", self.callback) 
... 
def callback(self, event): 
    print("callback called") 
+0

答えとリンクのためのThnaks。残念ながら、私は正しい答えだけを選ぶことができます。しかし、私はupvoted :-) – luc

関連する問題