第 2 章 サブウィンドウ

◀ 2.18 タイトルバーの非表示   【目  次】  2.20 表示状態の制御 ▶

999999

 更新日:


 このホームページは Amazon Kindle 本の作成中の草稿です。日々、原稿を見直しているので、内容が変わることに留意して読んで下さい。本が出版され次第、このホームページは削除されます。

2.19 クローズボタンの無効化とウィンドウのクローズ(wm_protocol、protocol、destroy、quit)

 サブウィンドウはタスクバーにあるメニューの「閉じる」かクローズボタンをマウスの左クリックすると、システムがウィンドウを閉じてくれます。このシステムの閉じる操作をメインウィンドウと同様にアプリケーションの別の操作に設定することができます。1.19 クローズボタンの無効化とウィンドウのクローズを参照して下さい。

 次のプログラムはサブウィンドウのタイトルバーの閉じる操作をアプリケーションで実行しています。閉じる操作で「delfunc」関数を呼び出して文字列「delfunc() execution」を「print」出力します。また、「bind」メソッドで、クライアント領域をマウスの右クリックすることで、「destroy」メソッドを実行してサブウィンドウが閉じるようにしています。

1
import tkinter as tk
2
root = tk.Tk()
3
root.geometry('300x200+100+100')
4
sub = tk.Toplevel(root, width=300, height=200, bg='red')
5
sub.geometry('+140+120')
6
root.update()
7
root.wm_deiconify()
8
sub.wm_deiconify()
9
def delfunc():
10
    print('delfunc() execution')
11
sub.wm_protocol('WM_DELETE_WINDOW', delfunc)
12
sub.bind('<Button-3>', lambda event: sub.destroy())
13
root.mainloop()

 このプログラムを実行すると、サブウィンドウのタスクバーでの閉じる操作ではサブウィンドウは閉じません。下記の「print」出力が得られます。サブウィンドウのクライアント領域をマウスで右クリックすると、サブウィンドウは閉じられます。

delfunc() execution


 次のプログラムはサブウィンドウのタイトルバーの閉じる操作をアプリケーションで実行しています。閉じる操作で「quitfunc」関数を呼び出して、サブウィンドウのタイトルバーの閉じる操作を有効にして「quit」メソッドで「mainloop」メソッドを終了しています。「mainloop」メソッドの終了後、文字列「quit」を出力しています。次いで、再度「mainloop」メソッドを実行しています。

1
import tkinter as tk
2
root = tk.Tk()
3
root.geometry('300x200+100+100')
4
sub = tk.Toplevel(root, width=300, height=200, bg='red')
5
sub.geometry('+140+120')
6
root.update()
7
root.wm_deiconify()
8
sub.wm_deiconify()
9
def quitfunc():
10
    sub.wm_protocol('WM_DELETE_WINDOW', '')
11
    sub.quit()
12
sub.wm_protocol('WM_DELETE_WINDOW', quitfunc)
13
root.mainloop()
14
print('quit')
15
root.mainloop()

 このプログラムを実行すると、サブウィンドウのタスクバーでの閉じる操作で「mainloop」メソッドが終了して、下記の「print」出力が得られます。ただ、サブウィンドウは破棄されないので、次の「mainloop」メソッドが実行されてサブウィンドウが表示され続けます。次いで、サブウィンドウのタスクバーでの閉じる操作でサブウィンドウを閉じることができます。

quit

 上のプログラムで、11 行目の「quit」メソッドを「destroy」メソッドに置き換えると、サブウィンドウのタスクバーでの閉じる操作でサブウィンドウのオブジェクトが破棄されて、サブウィンドウは閉じられます。ただ、「mainloop」メソッドは終了しないので、メインウィンドウが閉じられるまで「print」出力はされません。