2.19 クローズボタンの無効化とウィンドウのクローズ(wm_protocol、protocol、destroy、quit)
サブウィンドウはタスクバーにあるメニューの「閉じる」かクローズボタンをマウスの左クリックすると、システムがウィンドウを閉じてくれます。このシステムの閉じる操作をメインウィンドウと同様にアプリケーションの別の操作に設定することができます。1.19 クローズボタンの無効化とウィンドウのクローズを参照して下さい。
次のプログラムはサブウィンドウのタイトルバーの閉じる操作をアプリケーションで実行しています。閉じる操作で「delfunc」関数を呼び出して文字列「delfunc() execution」を「print」出力します。また、「bind」メソッドで、クライアント領域をマウスの右クリックすることで、「destroy」メソッドを実行してサブウィンドウが閉じるようにしています。
import tkinter as tk | |
root = tk.Tk() | |
root.geometry('300x200+100+100') | |
sub = tk.Toplevel(root, width=300, height=200, bg='red') | |
sub.geometry('+140+120') | |
root.update() | |
root.wm_deiconify() | |
sub.wm_deiconify() | |
def delfunc(): | |
print('delfunc() execution') | |
sub.wm_protocol('WM_DELETE_WINDOW', delfunc) | |
sub.bind('<Button-3>', lambda event: sub.destroy()) | |
root.mainloop() |
このプログラムを実行すると、サブウィンドウのタスクバーでの閉じる操作ではサブウィンドウは閉じません。下記の「print」出力が得られます。サブウィンドウのクライアント領域をマウスで右クリックすると、サブウィンドウは閉じられます。
次のプログラムはサブウィンドウのタイトルバーの閉じる操作をアプリケーションで実行しています。閉じる操作で「quitfunc」関数を呼び出して、サブウィンドウのタイトルバーの閉じる操作を有効にして「quit」メソッドで「mainloop」メソッドを終了しています。「mainloop」メソッドの終了後、文字列「quit」を出力しています。次いで、再度「mainloop」メソッドを実行しています。
import tkinter as tk | |
root = tk.Tk() | |
root.geometry('300x200+100+100') | |
sub = tk.Toplevel(root, width=300, height=200, bg='red') | |
sub.geometry('+140+120') | |
root.update() | |
root.wm_deiconify() | |
sub.wm_deiconify() | |
def quitfunc(): | |
sub.wm_protocol('WM_DELETE_WINDOW', '') | |
sub.quit() | |
sub.wm_protocol('WM_DELETE_WINDOW', quitfunc) | |
root.mainloop() | |
print('quit') | |
root.mainloop() |
このプログラムを実行すると、サブウィンドウのタスクバーでの閉じる操作で「mainloop」メソッドが終了して、下記の「print」出力が得られます。ただ、サブウィンドウは破棄されないので、次の「mainloop」メソッドが実行されてサブウィンドウが表示され続けます。次いで、サブウィンドウのタスクバーでの閉じる操作でサブウィンドウを閉じることができます。
上のプログラムで、11 行目の「quit」メソッドを「destroy」メソッドに置き換えると、サブウィンドウのタスクバーでの閉じる操作でサブウィンドウのオブジェクトが破棄されて、サブウィンドウは閉じられます。ただ、「mainloop」メソッドは終了しないので、メインウィンドウが閉じられるまで「print」出力はされません。