[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