1.19 クローズボタンの無効化とウィンドウのクローズ(wm_protocol、protocol、destroy、quit)
タスクバーにあるメニューの「閉じる」かクローズボタンをマウスの左クリックすると、システムがウィンドウを閉じてくれます。このシステムの閉じる操作をアプリケーションの別の操作に設定することができます。 Wm クラスメソッドの「wm_protocol」または「protocol」メソッドを用います。下記の書式を用います。詳細は Wm クラスメソッドを参照して下さい。
引数 name にはウィンドウを閉じるイベントの「WM_DELETE_WINDOW」を指定します。引数 func にはアプリケーションで処理する関数名を指定します。
ウィンドウを閉じるには「Tk」クラスで定義されている以下の「destroy」メソッドを用います。
備考
このオブジェクトの Tcl インタプリタの適用を終了します。
次のプログラムはウィンドウのタイトルバーの閉じる操作をアプリケーションで実行しています。閉じる操作で「delfunc」関数を呼び出して文字列「delfunc() execution」を「print」出力します。また、「bind」メソッドで、クライアント領域をマウスの右クリックすることで、「destroy」メソッドを実行してウィンドウが閉じるようにしています。「bind」メソッドについては Misc クラスメソッドを参照して下さい。
import tkinter as tk | |
root = tk.Tk() | |
root.config(width=300, height=200) | |
def delfunc(): | |
print('delfunc() execution') | |
root.wm_protocol('WM_DELETE_WINDOW', delfunc) | |
root.bind('<Button-3>', lambda event: root.destroy()) | |
root.mainloop() |
このプログラムを実行すると、ウィンドウのタスクバーでの閉じる操作ではウィンドウは閉じません。下記の「print」出力が得られます。ウィンドウのクライアント領域をマウスで右クリックすると、ウィンドウは閉じられます。
ウィンドウを閉じるにはMisc クラスメソッドで定義されている以下の「quit」メソッドも用いることができます。詳細は Misc クラスメソッドを参照して下さい。
このメソッドは先の「destroy」メソッドと異なり、「mainloop」メソッドを終了させるだけでオブジェクトを廃棄しないので、実行後にオブジェクトを再度使用することができます。
次のプログラムはウィンドウのタイトルバーの閉じる操作をアプリケーションで実行しています。閉じる操作で「quitfunc」関数を呼び出して、ウィンドウのタイトルバーの閉じる操作を有効にして「quit」メソッドで「mainloop」メソッドを終了しています。「mainloop」メソッドの終了後、文字列「quit」を出力しています。次いで、再度「mainloop」メソッドを実行しています。
import tkinter as tk | |
root = tk.Tk() | |
root.config(width=300, height=200) | |
def quitfunc(): | |
root.wm_protocol('WM_DELETE_WINDOW', '') | |
root.quit() | |
root.wm_protocol('WM_DELETE_WINDOW', quitfunc) | |
root.mainloop() | |
print('quit') | |
root.mainloop() |
このプログラムを実行すると、ウィンドウのタスクバーでの閉じる操作で「mainloop」メソッドが終了して、下記の「print」出力が得られます。ただ、ウィンドウは破棄されないので、次の「mainloop」メソッドが実行されてウィンドウが表示され続けます。次いで、ウィンドウのタスクバーでの閉じる操作でウィンドウを閉じることができます。
上のプログラムで、6 行目の「quit」メソッドを「destroy」メソッドに置き換えると、ウィンドウのタスクバーでの閉じる操作でオブジェクトが破棄されて、すべての「mainloop」メソッドが終了するので、「print」出力後にウィンドウは閉じられます。