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

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

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

4 Solutions collect form web for “Переопределение кнопки кнопки Tkinter «X» (кнопка, закрывающая окно)”

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

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


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

 root.protocol('WM_DELETE_WINDOW', doSomething) # root is your root window def doSomething(): # check if saving # if not: root.destroy() 

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

Используя метод 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() 

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

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

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

Python - лучший язык программирования в мире.