tkinter-protocol-破棄ウィンドウの作成


WM_DELETE_WINDOW
Tkinterは、イベントバインディングに加えて、プロトコルハンドラと呼ばれるメカニズムをサポートします.プロトコルとは、アプリケーションとウィンドウマネージャの相互作用です.最も一般的なプロトコルは、WM_DELETE_WINDOWと呼ばれ、ユーザがウィンドウマネージャを使用してウィンドウを明示的に閉じるときに発生する状況を定義するために使用される.プロトコル・メソッドを使用して、このプロトコルにハンドラをインストールできます(ウィジェットはルートまたはトップレベルのプラグインでなければなりません):
widget.protocol("WM_DELETE_WINDOW", handler)

独自のハンドラhandlerが定義されると、Tkinterはウィンドウを自動的に閉じることはなくなります.逆に、メッセージ・ボックスを表示して、ユーザーに現在のデータを保存すべきかどうかを尋ねるか、場合によってはリクエストを無視するだけでよい場合があります.このプロセッサからウィンドウを閉じるには、ウィンドウのdestroyメソッドを呼び出すだけです.
例:ウィンドウxをクリックして終了すると、確認画面が追加される(tkinter.messagebox.askokcancel())
from tkinter import Tk
from  tkinter import messagebox
#tkinter     

root = Tk()
#      x   ,     
def on_closing():
    if messagebox.askokcancel("Quit", "Do you want to quit?"):
        root.destroy()

# WM_DELETE_WINDOW     ,      
root.protocol('WM_DELETE_WINDOW', on_closing)
root.mainloop()


However, as of Python 1.5.2, Tkinter will not destroy the corresponding widget instance hierarchy, so it is a good idea to always register a handler yourself
トップウィンドウでWM_でない場合でもご注意くださいDELETE_WINDOW登録処理プログラムは、このウィンドウ自体も通常通り破棄される(制御方式でXとは異なる).ただし、Python 1.5.2からTkinterは対応するウィンドウウィジェットインスタンス階層を破壊しないため、常に自分でプロセッサを登録するのが良いアイデアです.
top = Toplevel(...)

# make sure widget instances are deleted
top.protocol("WM_DELETE_WINDOW", top.destroy)

Other Protocols
ウィンドウマネージャプロトコルは、最初はXウィンドウシステムの一部(Inter-client Communication Conventions Manual,or ICCCMという名前のドキュメントで定義されています).このプラットフォームでは、WM_TAKE_FOCUSWM_SAVE_YOURSELFなどの他のプロトコルのプロセッサをインストールすることもできます.詳細については、ICCCMドキュメントを参照してください.
原文リンク:protocols