2011-01-10 15 views
6

私はPythonでTkinterを使ってクライアント/サーバプログラムを書いています。私は接続されたクライアントを追跡するためにサーバーが必要です。このため、終了ボタン(コーナーの標準の「X」)をクリックした後、クライアントにサーバーに自動化されたメッセージを送信させたいと思います。ユーザーがプログラムを終了したときをどのように知ることができますか?Intercept Tkinter "Exit"コマンド?

+0

可能重複[?私はTkinterでは、ウィンドウクローズイベントを処理するにはどうすればよいです](http://stackoverflow.com/questions/111155/how-do-i-handle-ウィンドウのclose-event-in-tkinter) – nbro

答えて

13

トップレベルウィンドウのメソッドを使用します。具体的には、WM_DELETE_WINDOWプロトコルに興味があります。このメソッドを使用すると、ウィンドウが破棄されたときに呼び出されるコールバックを登録できます。

使用法:

root.protocol("WM_DELETE_WINDOW", app.on_delete) 
+0

私は 'root.mainloop()'を呼び出す前に 'root.protocol(" WM_DELETE_WINDOW "、app.on_delete())'という行を追加しましたが、 'on_delete () 'がウィンドウが開かれたときに呼び出され、閉じられていないときに呼び出されます。私は何か間違っているのですか? – John

+5

@ John: 'protocol'メソッドは関数への参照をとります。末尾の括弧を追加することによって、 'app.on_delete'を呼び出し、そのメソッドの結果をプロトコルハンドラに渡します。正しい使用法は 'root.protocol(" WM_DELETE_WINDOW "、app.on_delete)' –

+0

パーフェクト!ありがとう! – John

1

FWIW:それはウィジェット固有の動作を割り当てることも可能です。

特定のウィジェットが破棄されたときにアクションが発生するようにするには、destroy()メソッドをオーバーライドすることを検討してください。 、フレーム「F」は「B1」と子供と、破壊された「B2」ボタンが押され

class MyButton(Tkinter.Button): 
    def destroy(self): 
     print "Yo!" 
     Tkinter.Button.destroy(self) 

root = Tkinter.Tk() 

f = Tkinter.Frame(root) 
b1 = MyButton(f, text="Do nothing") 
b1.pack() 
f.pack() 

b2 = Tkinter.Button(root, text="f.destroy", command=f.destroy)   
b2.pack() 

root.mainloop() 

次の例を参照してください「ヨ!」印刷されます。

私は同じ回答をthis topicに掲載しました。私の場合は

1

、次のコードは動作しませんでした:

root.protocol("WM_DELETE_WINDOW", app.on_delete) # doesn't work 

はしかし、それは、このフォームを使用して働いていた:

root.wm_protocol ("WM_DELETE_WINDOW", app.on_delete) # does work 
+0

'.protocol'を使う答えはありませんが、受け入れられた答えはすでに' .wm_protocol'を使うと言われています。 – ArtOfWarfare

5

あなたのpython atexitモジュールを使用することができます。例えば

import atexit 

def doSomethingOnExit(): 
    pass 

atexit.register(doSomethingOnExit) 
+0

これは私にとって完璧に機能しました。他のものは決して誘発されなかった。 – ArtOfWarfare

関連する問題