[Python-es] wxpython y threads que se atascan.

Chema Cortes pych3m4 en gmail.com
Mie Ene 18 20:17:54 CET 2012


El día 18 de enero de 2012 00:02, Txema Vicente <txema en nabla.net> escribió:

> No se si es que wx obliga a llamar a MainLoop() en __main__ (no, verdad?)
> O es algo que deberia saber de python y esto no se debe hacer por algún
> motivo?
>
> Explicación?

Es curioso el caso. En cualquier caso, nunca un "import" debería tener
otros efectos laterales que no sea el de declarar e inicializar
objetos. Pero sobre todo, nunca debería lanzar hilos de ejecución por
no ser seguro, tal y como indica la documentación:

  http://docs.python.org/library/threading.html#importing-in-threaded-code

El porqué se bloquea con unas funciones y no con otras, es algo que
debe ser culpa del GIL. Lo mejor para estar seguros es que en el
import te limites a "declarar" y que continúes la ejecución una vez
terminada la importación:

def main():
    app = wx.App(redirect=False)
    app.SetTopWindow(Frame())
    app.MainLoop()

if __name__=="__main__":
    main()

En 'curioso.py', una vez importado el módulo, ya podrás ejecutar la
aplicación con seguridad a través de la función 'main()'


Por otro lado, me parece horrible pasar una clase (Test) donde te pide
una función para responder al EVT_BUTTON. Aquí pierdes todo control
sobre el hilo hijo. Supongo que no será así en el código final.



-- 
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales


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