【Python/tkinter】ウィンドウ(Frame)のxボタンがクリックされたときの終了確認

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()メソッドを呼び出して、プログラムを終了させる必要があります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください