第 1 章 メインウィンドウ

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

999999

 更新日:


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

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

 タスクバーにあるメニューの「閉じる」かクローズボタンをマウスの左クリックすると、システムがウィンドウを閉じてくれます。このシステムの閉じる操作をアプリケーションの別の操作に設定することができます。 Wm クラスメソッドの「wm_protocol」または「protocol」メソッドを用います。下記の書式を用います。詳細は Wm クラスメソッドを参照して下さい。

object.wm_protocol(name=None, func=None)
object.protocol(name=None, func=None)

 引数 name にはウィンドウを閉じるイベントの「WM_DELETE_WINDOW」を指定します。引数 func にはアプリケーションで処理する関数名を指定します。

 ウィンドウを閉じるには「Tk」クラスで定義されている以下の「destroy」メソッドを用います。

object.destroy()
 このオブジェクトとそのオブジェクト上に設定されたすべてのウィジェットを破棄します。

備考
 このオブジェクトの Tcl インタプリタの適用を終了します。

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

1
import tkinter as tk
2
root = tk.Tk()
3
root.config(width=300, height=200)
4
def delfunc():
5
    print('delfunc() execution')
6
root.wm_protocol('WM_DELETE_WINDOW', delfunc)
7
root.bind('<Button-3>', lambda event: root.destroy())
8
root.mainloop()

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

delfunc() execution


 ウィンドウを閉じるにはMisc クラスメソッドで定義されている以下の「quit」メソッドも用いることができます。詳細は Misc クラスメソッドを参照して下さい。

object.quit()

 このメソッドは先の「destroy」メソッドと異なり、「mainloop」メソッドを終了させるだけでオブジェクトを廃棄しないので、実行後にオブジェクトを再度使用することができます。

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

1
import tkinter as tk
2
root = tk.Tk()
3
root.config(width=300, height=200)
4
def quitfunc():
5
    root.wm_protocol('WM_DELETE_WINDOW', '')
6
    root.quit()
7
root.wm_protocol('WM_DELETE_WINDOW', quitfunc)
8
root.mainloop()
9
print('quit')
10
root.mainloop()

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

quit

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