Mini-consejos Tkinter

Ernesto Revilla erny en sicem.biz
Jue Mar 11 12:53:56 CET 2004


Hola,

como he oído algo de problemas con Tkinter, aquí unos pocos consejos:

* si posible, efectuar todas las llamadas a Tkinter desde la misma hebra, y si posible desde la principal. El problema es que Tkinter no es thread-safe y eso hace que al efectuar determinadas llamadas, pueda dar un segmentation-fault. Así que no sirve, ejecutar el mainloop en una hebra, y realizar llamadas a Tkinter (como creación de ventanas, etc.) en otra hebra.

* para actualizar un control periódicamente, usar la función after:
self.root.after(100,self.mitareaperiodica)
def mitareaperiodica(self, ...):
    ...
    self.root.after(100,self.mitareaperiodica)  # programar de nuevo!!!

* vale, el problema es que si hay algún proceso que tarda tiempo, deja la interfaz tiesa. En ese caso, es necesario realizar la otra tarea en una hebra separada. Ahora bien, ¿cómo intercomunicar el progreso de la otra tarea con la interfaz gráfica? Por ejemplo, mediante Queue (módulo Queue). La nueva hebra escribe, y la hebra principal saca (en su proceso periódico) información a visualizar en la interfaz (en plan productor-consumidor).
En algunos casos, no casca. No me ha quedado muy claro, cómo y cuándo, y supongo que depende de la versión de Tkinter. 

* no realizar operaciones sobre controles y ventanas una vez terminado el mainloop. Si por lo que sea, alguna ventana se queda abierta, y el mainloop termina, e intentamos cerrar esa ventana, puede que casque.

consultar las fuentes:

http://www.pythonware.com/library/tkinter/introduction/index.htm
http://www.nmt.edu/tcc/help/pubs/tkinter.pdf

Erny




Más información sobre la lista de distribución Python-es