2010-07-20 1 views
21

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

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

ответ

33

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

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


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

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

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

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

1

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

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

+0

overrideredirect (флаг = нет) [#] Устанавливает или получает флаг переопределения переопределения. Если ненулевое значение, это не позволяет оконному менеджеру украшать окно. Другими словами, у окна не будет названия или границы, и он не может быть перемещен или закрыт обычными способами. – Jacob

2

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

5

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

[Перехват команды Tkinter «Выход»?] (Http://stackoverflow.com/questions/4643007/intercept-tkinter-exit-command) –

 Смежные вопросы

  • Нет связанных вопросов^_^