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

Txema Vicente txema en nabla.net
Mie Ene 18 00:02:57 CET 2012


Buenas.

Estoy trasteando con threading y wxpython, y me he topado con una cosa 
curiosa, que no entiendo por qué pasa.

La cosa es que si lanzo un hilo a trabajar, todo bien hasta que llega a 
un os.walk, en ese punto el hilo se pausa hasta que se cierre el frame, 
y en ese momento prosigue el os.walk. Despues de darle vueltas, he 
aislado el problema y ya se en que condiciones pasa, lo que me gustaría 
es saber el motivo. También pasa con encode (que supongo os.walk utilizará)

Esto funciona bien, si se ejecuta directamente :

#--- fichero: prueba.py
import wx
import threading

class Test(threading.Thread):
     def __init__(self, evento=None):
         threading.Thread.__init__(self)
         self.start()

     def run(self):
         print "TEST START"
         for i in range(10):
             print "->", str(i).encode('utf-8')
         print "TEST END"


class Frame(wx.Frame):
     def __init__(self):
         wx.Frame.__init__(self, None, title="X", size=(350,200))
         p = wx.Panel(self)
         b = wx.Button(p, -1, "Test")
         b.Bind(wx.EVT_BUTTON, Test)
         self.Show()

app = wx.App(redirect=False)
app.SetTopWindow(Frame())
app.MainLoop()
#--- EOF

Pero si  importo prueba desde otro script , todo funciona pero el hilo 
Test se queda pausado al llegar al encode.

#--- fichero: curioso.py
import prueba
#--- EOF

Si no se llama a  MainLoop() en prueba.py y se hace en curioso.py, se 
arregla.

Hasta que me he topado con esto todo funcionaba perfectamente, si los 
hilos no contienen os.walk o decode (y habrá más, supongo).

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?

Saludos.



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