【Python】tkinter:ウィンドウを閉じるボタンが押された時の動作を変更

時計 2022.05.18 / 時計

【Python】tkinter:ウィンドウを閉じるボタンが押された時の動作を変更

本記事ではPythontkinterにおける、ウィンドウを閉じるボタン(「×」ボタン)が押された時の動作を変更する方法について解説していきます。

GUIアプリケーションを作成していると、ユーザーがウィンドウを「×」ボタンで閉じる前に特定の処理を走らせたいことがあります。例えば、ウィンドウを閉じていいのか確認ダイアログの表示や、変更したデータを保存してから閉じるか確認するダイアログの確認などです。

本記事ではtkinterのプロトコルで、WM_DELETE_WINDOWを使用する方法について解説しています。

ぜひ本記事を通して、ウィンドウを閉じるときのイベントをキャッチして、関数を実行する方法を学んでください。

tkinterとは

tkinterとはGUIアプリケーションの作成に使用されるPythonの標準ライブラリです。標準ライブラリのため、面倒なインストール作業など必要がなく、すぐにGUIプログラムを作ることができます。

Tcl/TkというGUIライブラリのTkの部分をPythonで利用できるようにしたものであり、Tkはクロスプラットフォームなので、WindowsやMac OS、Linux等様々なプラットフォームで利用可能です

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()
tkinter:ウィンドウを閉じる前にメッセージを表示するアプリ

サンプルコードで使用したメッセージボックスの表示方法は以下記事をご参照ください。