Подтвердить что ты не робот

Переопределение кнопки кнопки Tkinter "X" (кнопка, закрывающая окно)

Когда пользователь нажимает закрытие Button, которое я создал, некоторые задачи выполняются перед выходом. Однако, если пользователь нажимает кнопку [X] в правом верхнем углу окна, чтобы закрыть окно, я не могу выполнять эти задачи.

Как я могу переопределить то, что происходит, когда пользователь нажимает кнопку [X]?

4b9b3361

Ответ 1

Звучит так, как будто ваше окно сохранения должно быть modal.

Если это базовое окно сохранения, почему вы изобретаете колесо? Tk имеет tkFileDialog для этой цели.


Если вы хотите переопределить поведение по умолчанию для уничтожения окна, вы можете просто сделать:

root.protocol('WM_DELETE_WINDOW', doSomething)  # root is your root window

def doSomething():
    # check if saving
    # if not:
    root.destroy()

Таким образом, вы можете перехватить вызов destroy(), когда кто-то закрывает окно (каким-либо образом) и делает то, что вам нравится.

Ответ 2

Используя метод procotol, мы можем переопределить протокол WM_DELETE_WINDOW, связав с ним вызов функции, в этом случае функция называется on_exit:

import tkinter as tk
from tkinter import messagebox


class App(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Handling WM_DELETE_WINDOW protocol")
        self.geometry("500x300+500+200")
        self.make_topmost()
        self.protocol("WM_DELETE_WINDOW", self.on_exit)

    def on_exit(self):
        """When you click to exit, this function is called"""
        if messagebox.askyesno("Exit", "Do you want to quit the application?"):
            self.destroy()

    def center(self):
        """Centers this Tk window"""
        self.eval('tk::PlaceWindow %s center' % app.winfo_pathname(app.winfo_id()))

    def make_topmost(self):
        """Makes this window the topmost window"""
        self.lift()
        self.attributes("-topmost", 1)
        self.attributes("-topmost", 0)


if __name__ == '__main__':
    App().mainloop()

Ответ 3

Команда, которую вы ищете, это wm_protocol, предоставляя ей "WM_DELETE_WINDOW" в качестве протокола для привязки. Он позволяет определить процедуру вызова, когда оконный менеджер закрывает окно (что происходит, когда вы нажимаете [x]).

Ответ 4

Я нашел ссылку на Tkinter здесь. Это не идеально, но охватывает почти все, что мне когда-либо понадобилось. Я рисую раздел 30.3 (Типы событий), он сообщает нам, что для виджетов есть событие "Уничтожить". Полагаю, что .bind() ваши задания сохранения на это событие вашего главного окна должны сделать трюк.

Вы также можете вызвать mainwindow.overrideredirect(True) (раздел 24), который отключает минимизацию, изменение размера и закрытие с помощью кнопок в строке заголовка.