【Python】tkinter:ウィンドウを閉じるボタンが押された時の動作を変更
2022.05.18 /
本記事ではPythonのtkinterにおける、ウィンドウを閉じるボタン(「×」ボタン)が押された時の動作を変更する方法について解説していきます。
GUIアプリケーションを作成していると、ユーザーがウィンドウを「×」ボタンで閉じる前に特定の処理を走らせたいことがあります。例えば、ウィンドウを閉じていいのか確認ダイアログの表示や、変更したデータを保存してから閉じるか確認するダイアログの確認などです。
本記事ではtkinterのプロトコルで、WM_DELETE_WINDOWを使用する方法について解説しています。
ぜひ本記事を通して、ウィンドウを閉じるときのイベントをキャッチして、関数を実行する方法を学んでください。
tkinterとは
tkinterとはGUIアプリケーションの作成に使用されるPythonの標準ライブラリです。標準ライブラリのため、面倒なインストール作業など必要がなく、すぐにGUIプログラムを作ることができます。
Tcl/TkというGUIライブラリのTkの部分をPythonで利用できるようにしたものであり、Tkはクロスプラットフォームなので、WindowsやMac OS、Linux等様々なプラットフォームで利用可能です
tkinterによるGUIアプリケーションの作成方法は以下記事をご参照ください。
【Python】tkinterを使ったGUIアプリケーションの作成方法
ウィンドウが閉じられる時のイベントをキャッチする
プロトコル:WM_DELETE_WINDOW
Tkinterにはプロトコルハンドラという仕組みがあり、これを利用することでユーザーがアプリケーションのウィンドウを閉じるときのイベントをキャッチすることができます。
プロトコルハンドラは次のように使用します。
widget.protocol("protocol name", handler)
widgetにはルートまたはトップレベルのウィジェットを指定する必要があります。handlerにはイベントをキャッチしたときに実行する関数を指定します。
「ユーザーがウィンドウを閉じるイベント」を指定する場合はprotocol nameに次の値を指定します。
WM_DELETE_WINDOW
「ユーザーがウィンドウを閉じるイベント」とはアプリケーションの画面右上の「×」を押したときのことを指します。
サンプルコード
以下にユーザーがウィンドウを閉じるボタンを押した際に、そのイベントをキャッチして関数を実行するサンプルコードを記します。
# tkinterのインポート
import tkinter as tk
import tkinter.ttk as ttk
def click_close():
pass
# rootメインウィンドウの設定
root = tk.Tk()
root.title("window close event")
root.geometry("300x50")
# メインフレームの作成と設置
frame = ttk.Frame(root)
frame.grid(column=0, row=0, sticky=tk.NSEW, padx=5, pady=10)
# 各種ウィジェットの作成
label = ttk.Label(frame, text="Window close event")
# 各種ウィジェットの設置
label.grid(row=0, column=0)
root.protocol("WM_DELETE_WINDOW", click_close)
root.mainloop()
WM_DELETE_WINDOWにハンドラを指定すると、そのウィンドウは「×」で閉じることができなくなります。ウィンドウを閉じる場合は、destroy()を使ってウィンドウを破棄する方法を取る必要があります
ウィンドウを閉じる前にメッセージを表示する
WM_DELETE_WINDOWを利用する場面として、ユーザーにウィンドウを閉じていいのか確認する場面や、変更したデータを保存してから閉じるか確認する場面などが考えられます。
例として、ウィンドウの「×」が押されたときに閉じるか確認するメッセージを表示するサンプルを以下に記します。
# tkinterのインポート
import tkinter as tk
import tkinter.ttk as ttk
from tkinter import messagebox
def click_close():
if messagebox.askokcancel("確認", "本当に閉じていいですか?"):
root.destroy()
# rootメインウィンドウの設定
root = tk.Tk()
root.title("window close event")
root.geometry("300x50")
# メインフレームの作成と設置
frame = ttk.Frame(root)
frame.grid(column=0, row=0, sticky=tk.NSEW, padx=5, pady=10)
# 各種ウィジェットの作成
label = ttk.Label(frame, text="Window close event")
# 各種ウィジェットの設置
label.grid(row=0, column=0)
root.protocol("WM_DELETE_WINDOW", click_close)
root.mainloop()
サンプルコードで使用したメッセージボックスの表示方法は以下記事をご参照ください。
【Python tkinter】メッセージボックスを表示するメソッド一覧(messagebox)