このページでは、Tkinter で開発するアプリの「閉じるボタン(終了ボタン)がクリックされた時の処理」の変更方法について解説します。

デフォルトでは、アプリの閉じるボタン(終了ボタン)がクリックされた時にはアプリの終了処理が実行されるようになっています。
ですが、このページで解説する方法を適用することで、アプリの閉じるボタンがクリックされた時の処理を変更することができるようになります。それにより、例えばアプリの終了前にメッセージボックスを表示したり、データを保存したりすることが可能となります。

閉じるボタンがクリックされた時の処理の変更方法
では、閉じるボタンがクリックされた時の処理の変更方法について解説します。
イベントハンドラーの設定
結論としては、メインウィンドウを app とした場合、mainloop 実行前に下記を追加で実行するようにするだけで、閉じるボタンクリック時の処理の変更が実現できます。イベントハンドラー 部分には関数 or メソッドを指定します。
app.protocol('WM_DELETE_WINDOW', イベントハンドラー)
上記を実行しておけば、閉じるボタンがクリックされた時に、アプリが終了するのではなく、引数で指定した イベントハンドラー が実行されるようになります。

イベントハンドラー は開発者自身が好きなように定義することができるので、イベントハンドラー に閉じるボタンがクリックされた時に実行したい処理を実装しておくことで、閉じるボタンがクリックされた時の処理を開発者が好きなように変更することが可能となります。

スポンサーリンク
イベントハンドラー の定義
前述の通り、イベントハンドラー は関数もしくはメソッドになります。この イベントハンドラー の定義の仕方について解説しておきます。
名前は好きなように定義して OK
まず、イベントハンドラー の関数 or メソッドに関しては好きなように名付けてオーケーです。on_closing くらいが分かりやすいかもしれないです。
仮引数は「なし」
また、イベントハンドラー は「仮引数なし」で定義するようにしてください。閉じるボタンがクリックされて イベントハンドラー が実行される際には「引数なし」で実行されることになるため、仮引数も不要となります。むしろ、仮引数を定義すると、閉じるボタンクリック時に例外が発生するようになります。
必要に応じてアプリの終了処理を実行
さらに、イベントハンドラー では、必要に応じてアプリの終了処理を実装しておく必要があります。前述の通り、下記を実行すれば、閉じるボタンクリック時にアプリが終了するのではなく、イベントハンドラー が実行されるようになります。
app.protocol('WM_DELETE_WINDOW', イベントハンドラー)
逆に言えば、イベントハンドラー 内の処理内容によっては、閉じるボタンクリック時にアプリが終了しなくなるということになります。
例えば、閉じるボタンクリック時に、何らかの処理を実行してからアプリを終了させるようにしたいのであれば、イベントハンドラー は、その “何らかの処理” を実行してからアプリの終了処理が実行されるように定義しておく必要があります。
この、アプリの終了は、メインウィンドウ.destroy() を実行することで実施可能ですので、必要に応じて イベントハンドラー 内で メインウィンドウ.destroy() を実行するようにしてください。もし、閉じるボタンのクリックではアプリを終了させたくないのであれば、イベントハンドラー 内で メインウィンドウ.destroy() は実行しなくて OK です。
基本的には、上記で説明した「仮引数はなし」と「必要に応じて メインウィンドウ.destroy() を実行する」という2点に注意すれば、あとは好きなように イベントハンドラー を定義してやれば良いです。
閉じるボタンがクリックされた時の処理の変更例
最後に、閉じるボタンがクリックされた時の処理を変更したアプリのサンプルスクリプトを紹介しておきます。
下記は、閉じるボタンがクリックされた時にメッセージボックスを表示するアプリのサンプルスクリプトになります。
import tkinter
from tkinter import messagebox
def on_closing():
# アプリを終了してよいかを確認
ret = messagebox.askokcancel(
title="確認", message="アプリを終了してよろしいですか?"
)
if ret:
# OKの場合はアプリを終了
app.destroy()
# メインウィンドウを作成
app = tkinter.Tk()
app.geometry("300x200")
# 閉じるボタンクリック時の処理の変更
app.protocol("WM_DELETE_WINDOW", on_closing)
# メインループ
app.mainloop()
スクリプトを実行して起動するアプリの閉じるボタンをクリックすれば、下の図のようなメッセージボックスが表示されるようになっています(下記は Mac の表示例で、Windows の場合はメッセージボックス等の見た目が異なります)。

このメッセージボックスでは、アプリの終了をユーザーが選択できるようになっており、OK ボタンがクリックされるとアプリが終了し、Cancel ボタンがクリックされると終了がキャンセルされるようになっています。
このように、閉じるボタンがクリックされた時の処理が変化したのは、ここまで説明してきた通り、下記を実行するようにしているためです。
app.protocol("WM_DELETE_WINDOW", on_closing)
さらに、アプリの終了の代わりに実行されるようになった on_closing でメッセージボックスを表示したり、ユーザーが選択したボタンに応じて処理を切り替えるようにしたりすることで、前述で示したような閉じるボタンクリック時の動作を実現しています。
また、メッセージボックスの OK ボタンがクリックされた時にアプリが終了するのは、この時に app.destroy() を実行しているからになります。この destroy() の実行が無いと、閉じるボタンをクリックしてもアプリを終了できなくなるため注意してください。
まとめ
このページでは、Tkinter で開発するアプリの閉じるボタン(終了ボタン)がクリックされた時の処理の変更方法について解説しました!
通常は、アプリの閉じるボタンがクリックされた時には単にアプリが終了するだけになっていますが、下記を実行することで、閉じるボタンがクリックされた際にアプリの終了の代わりに イベントハンドラー が実行されるようになり、これによって閉じるボタンクリック時の処理の変更を行うことが可能です。
app.protocol('WM_DELETE_WINDOW', イベントハンドラー)
一般的なアプリにおいても、変更内容が保存されていない時に閉じるボタンをクリックするとメッセージボックスが表示され、保存が不要かどうかを確認するようになっているものが多いです。そういった動作も、Tkinter で開発するアプリで実現できるようになりますので、是非、このページで解説した内容は覚えておいてください!
