TkinterのFrameで作成したウィンドウのxボタンをクリックしたときに、終了確認を表示して、プログラムを閉じる/閉じないを選択する方法です。
まず、何もしないウィンドウを表示するだけのベースとなるプログラムから手を加えていきます。
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master = None):
super().__init__(master)
self.master.geometry("300x300") # ウィンドウサイズ(幅x高さ)
if __name__ == "__main__":
root = tk.Tk()
app = Application(master = root)
app.mainloop()
(実行結果)
ここに、以下の一文を追加し、xボタンが押されたときに呼び出される関数を指定します。
関数名は何でも構いません。
self.master.protocol("WM_DELETE_WINDOW", self.delete_window)
全、コードはこちら
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master = None):
super().__init__(master)
self.master.geometry("300x300") # ウィンドウサイズ(幅x高さ)
# ウィンドウの x ボタンが押された時に呼ばれるメソッドを設定
self.master.protocol("WM_DELETE_WINDOW", self.delete_window)
def delete_window(self):
print("ウィンドウのxボタンが押された")
pass
if __name__ == "__main__":
root = tk.Tk()
app = Application(master = root)
app.mainloop()
このようにすると、delete_window()メソッドの部分で、printしているだけで特に何もしていないので、xボタンが押されても、ウィンドウが閉じられないプログラムとなります。
xボタンが押されたときにプログラムの終了確認を行うには、このメソッド内で行います。
終了確認を行うプログラムはこちら↓
import tkinter as tk
from tkinter import messagebox
class Application(tk.Frame):
def __init__(self, master = None):
super().__init__(master)
self.master.geometry("300x300") # ウィンドウサイズ(幅x高さ)
# ウィンドウの x ボタンが押された時に呼ばれるメソッドを設定
self.master.protocol("WM_DELETE_WINDOW", self.delete_window)
def delete_window(self):
print("ウィンドウのxボタンが押された")
# 終了確認のメッセージ表示
ret = messagebox.askyesno(
title = "終了確認",
message = "プログラムを終了しますか?")
if ret == True:
# 「はい」がクリックされたとき
self.master.destroy()
if __name__ == "__main__":
root = tk.Tk()
app = Application(master = root)
app.mainloop()
(実行結果)
delete_window()メソッド内で何もしなければ、ウィンドウは閉じられません。
プログラムを終了するには、明示的にdestroy()メソッドを呼び出して、プログラムを終了させる必要があります。