Todos los tutoriales de tkinter que he visto dicen que se debe llamar al tkinter.mainloop
para que se dibujen las ventanas y se procesen los eventos, y siempre llaman a esta función, incluso en los programas de hello world. Sin embargo, cuando pruebo esto en el shell interactivo, las ventanas se dibujan correctamente sin tener que llamar a mainloop. This example de incrustación de gráficos matplotlib en tkinter produce una aplicación relativamente compleja, con botones para panoramizar, ampliar y redimensionar un gráfico dentro de una ventana tkinter, y de nuevo, todo esto funciona si elimina la llamada a mainloop y ejecuta el código en el intérprete interactivo. Por supuesto, si ejecuto el script (con mainloop eliminado) fuera del shell interactivo, el programa finaliza demasiado rápido para ver qué sucede, pero si agrego una llamada al input
para mantener el programa abierto todo funciona correctamente (estoy ejecutando python 3.2.2 en Linux).¿Cuándo debo llamar a mainloop en una aplicación Tkinter?
¿Qué hace exactamente mainloop y cuándo es necesario llamarlo?
EDIT: para aclarar, si abro la terminal de GNOME y el tipo
$python3
>>> import tkinter
>>> root = tkinter.Tk()
aparece inmediatamente una ventana sin tener que llamar mainloop, y la funcionalidad tkinter más complejo parece funcionar tan bien (por ejemplo, agregando botones a la ventana). En IDLE, se necesita una llamada a mainloop. Tenía entendido que no se debería extraer nada, y no se deberían procesar eventos hasta que se llame a mainloop.
Lo siento, debería haber mencionado: Estoy utilizando el shell pitón estándar (no de reposo) en la terminal de GNOME (que está aparentemente escrito en C). Por lo que puedo ver, nada aparte de mi propio código debería estar haciendo algo que afecte a tkinter. – James
Acabo de probar lo mismo en IDLE, y no obtengo el mismo comportamiento: no aparece ninguna ventana hasta que llamo a mainloop. – James