2010-07-20 431 views

Respuesta

33

Parece que su ventana de guardado debe ser modal.

Si esta es una ventana de salvar básica, ¿por qué está reinventando la rueda? Tk tiene un tkFileDialog para este propósito.


Si lo que desea es anular el comportamiento por defecto de la destrucción de la ventana, sólo tiene que hacer:

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

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

De esta manera, se puede interceptar la llamada destroy() cuando alguien cierra la ventana (por cualquier medio) y haz lo que quieras.

1

Encontré una referencia en Tkinter here. No es perfecto, pero cubre casi todo lo que alguna vez necesité. Creo que la sección 30.3 (Tipos de eventos) ayuda, nos dice que hay un evento "Destruir" para widgets. Supongo que vincular() tus trabajos de guardado a ese evento de tu ventana principal debería ser el truco.

También puede llamar a mainwindow.overrideredirect (True) (sección 24), que desactiva la minimización, el cambio de tamaño y el cierre a través de los botones de la barra de título.

+0

overrideredirect (bandera = None) [#] Establece u obtiene la bandera de redirección de reemplazo. Si no es cero, esto evita que el administrador de ventanas decore la ventana. En otras palabras, la ventana no tendrá un título o un borde, y no se puede mover o cerrar por medios ordinarios. – Jacob

2

El comando que está buscando es wm_protocol, dándole "WM_DELETE_WINDOW" como protocolo para enlazar. Le permite definir un procedimiento para llamar cuando el administrador de ventanas cierra la ventana (que es lo que sucede cuando hace clic en [x]).

5

Utilizando el método procotol, podemos redefinir el protocolo WM_DELETE_WINDOW asociando con ella la llamada a una función, en este caso la función se llama 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

[¿Interceptar el comando "Salir" de Tkinter?] (Http://stackoverflow.com/questions/4643007/intercept-tkinter-exit-command) –

Cuestiones relacionadas