2011-01-10 25 views
6

Estoy escribiendo un programa cliente-servidor en Python con Tkinter. Necesito que el servidor realice un seguimiento de los clientes conectados. Para esto, me gustaría que el cliente envíe un mensaje automático al servidor después de hacer clic en el botón de salida (la "X" estándar en la esquina). ¿Cómo puedo saber cuándo el usuario está saliendo del programa?Interceptar el comando "Salir" de Tkinter?

+0

posible duplicado de [? ¿Cómo puedo manejar el evento de cierre de ventana en Tkinter] (http://stackoverflow.com/questions/111155/how-do-i-handle- the-window-close-event-in-tkinter) – nbro

Respuesta

13

Desea utilizar el método wm_protocol de la ventana toplevel. Específicamente, está interesado en el protocolo WM_DELETE_WINDOW. Si usa ese método, le permite registrar una devolución de llamada que se invoca cuando se destruye la ventana.

Uso:

root.protocol("WM_DELETE_WINDOW", app.on_delete) 
+0

Así que agregué esta línea: 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete())' justo antes de mi llamada a 'root.mainloop()' pero 'on_delete() 'recibe una llamada cuando la ventana está * abierta * y no cuando está cerrada. ¿Estoy haciendo algo mal? – John

+5

@John: el método 'protocol' toma como referencia una función. Al agregar el paréntesis final está llamando 'app.on_delete' y pasando el resultado de ese método al manejador de protocolo. El uso correcto es 'root.protocol (" WM_DELETE_WINDOW ", app.on_delete)' –

+0

¡Perfecto! ¡Gracias! – John

1

Fwiw: También es posible asignar un comportamiento específico en widgets.

Si desea que se produzca una acción cuando se destruye un widget específico, puede considerar anular el método destroy(). Véase el siguiente ejemplo:

class MyButton(Tkinter.Button): 
    def destroy(self): 
     print "Yo!" 
     Tkinter.Button.destroy(self) 

root = Tkinter.Tk() 

f = Tkinter.Frame(root) 
b1 = MyButton(f, text="Do nothing") 
b1.pack() 
f.pack() 

b2 = Tkinter.Button(root, text="f.destroy", command=f.destroy)   
b2.pack() 

root.mainloop() 

Cuando se pulsa el botón 'b2', la trama de 'f' se destruye, con el niño 'b1' y "¡Yo!" está impreso.

Publiqué la misma respuesta en this topic.

1

En mi caso, el siguiente código no funcionó:

root.protocol("WM_DELETE_WINDOW", app.on_delete) # doesn't work 

Sin embargo, funcionó través de este formulario:

root.wm_protocol ("WM_DELETE_WINDOW", app.on_delete) # does work 
+0

No hay ninguna respuesta que diga que se usa '.protocol', aunque ... la respuesta aceptada ya decía que se usa' .wm_protocol'. – ArtOfWarfare

5

Puede usar pitón atexit módulo.

Por ejemplo:

import atexit 

def doSomethingOnExit(): 
    pass 

atexit.register(doSomethingOnExit) 
+0

Esto funcionó perfectamente para mí. Los otros nunca se dispararon. – ArtOfWarfare

Cuestiones relacionadas