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?
Respuesta
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)
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
@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)' –
¡Perfecto! ¡Gracias! – John
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.
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
No hay ninguna respuesta que diga que se usa '.protocol', aunque ... la respuesta aceptada ya decía que se usa' .wm_protocol'. – ArtOfWarfare
Puede usar pitón atexit
módulo.
Por ejemplo:
import atexit
def doSomethingOnExit():
pass
atexit.register(doSomethingOnExit)
Esto funcionó perfectamente para mí. Los otros nunca se dispararon. – ArtOfWarfare
- 1. El compilador ignora el paréntesis faltante del comando Salir
- 2. ¿Cómo salir si falla un comando?
- 3. Cómo interceptar (detectar) un comando Pegar en un TMemo?
- 4. comando del sistema de ejecución de Python y luego salir ... no van a salir
- 5. Interceptar el botón Atrás
- 6. Forma correcta de salir del programa de línea de comando?
- 7. VIM: salir del modo de inserción con: comando normal
- 8. Método de comando de cambio para el botón Tkinter en Python
- 9. El comando del botón Tkinter se activa al ejecutar el programa?
- 10. Interceptar el evento de cierre de Windows Vista en C#
- 11. ¿Cómo escribir un programa de consola de Python puede salir como el comando superior en Linux?
- 12. Botones de creación de tkinter de Python para argumentos de comando de paso de bucle
- 13. Redirigir los resultados de la línea de comando a una interfaz gráfica de usuario de tkinter
- 14. Interceptar todo el tráfico saliente en OSX
- 15. Cómo salir de adb logcat
- 16. Interceptar ventanas abrir archivo
- 17. ¿Cómo puedo salir de un script nodeJS desde el script?
- 18. ¿Interceptar WM_DELETE_WINDOW en X11?
- 19. ¿Cómo puedo pasar argumentos al comando de devolución de llamada del botón Tkinter?
- 20. Interceptar JUnit Assert functions
- 21. Problema con el proceso Salir
- 22. Comando para hacer clic en los elementos de un widget Tkinter Treeview?
- 23. Salir de DE en el lote
- 24. ¿Hipervínculo en el widget Tkinter Text?
- 25. Tkinter: invocar evento en el bucle principal
- 26. múltiple Clave de eventos enlaces en Tkinter - "Control + E" "Comando (manzana) + E", etc
- 27. ¿Texto subrayado en el widget Etiqueta Tkinter?
- 28. Cómo implementar el patrón MVC en Tkinter
- 29. ¿Cuál es la forma preferida de salir de un programa de línea de comando?
- 30. Salir de otras aplicaciones en el cacao
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