Cómo enhebrar la barra de progreso de wxPython

Estoy tratando de enhebrar wx.ProgressDialog. Tengo una clase de subprocesos de progreso

class Progress(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): max = 1000000 dlg = wx.ProgressDialog("Progress dialog example", "An informative message", maximum = max, parent=None, style = wx.PD_CAN_ABORT | wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME | wx.PD_ESTIMATED_TIME | wx.PD_REMAINING_TIME ) keepGoing = True count = 0 while keepGoing and count = max / 2: (keepGoing, skip) = dlg.Update(count, "Half-time!") else: (keepGoing, skip) = dlg.Update(count) dlg.Destroy() 

que se llama cuando presiono un botón por

 class MiPPanel ( wx.Panel ): [...] def runmiP(self, event): thread1 = Progress() thread1.start() 

Cuando ejecuto thread1.start () obtengo cientos de advertencias del tipo 2012-12-01 00:31:19.215 Python[3235:8807] *** __NSAutoreleaseNoPool(): Object 0x11a88f300 of class NSConcreteAttributedString autoreleased with no pool in place - just leaking y la barra de progreso no aparece.

¿Cómo puedo usar hilos con wxPython para hacer una barra de progreso?

Todos los widgets y la manipulación de wxPython deben estar en un solo hilo. Si desea tener un cuadro de diálogo controlado por otro subproceso, tendrá que usar temporizadores y colas para enviar un mensaje al diálogo desde el otro hilo.

Otra forma en que entiendo se supone que funciona (no lo he probado) para crear un wxApp completamente separado en otro hilo solo para su diálogo. Tendrás que comunicarte de alguna manera al hilo principal aún.

Edición: Aquí hay un enlace a más información. Tiene información en la parte inferior sobre el uso de wx.CallAfter para actualizar el progreso de un subproceso de trabajo. También muestra cómo ejecutar una sola función en un subproceso independiente sin crear una clase separada.

wxPython Threading

Parece que se queja de que el argumento 4 no es una ventana de wx (de ahí el argument 4 of type 'wxWindow *' del error).

Mirando tu llamada, el argumento 4 es pasar parent=self . Entonces, ¿qué es el self ? En otras palabras, ¿de qué clase forma parte el método con este código? ¿Es algo que es un wx.Window o subclase de uno, o es algo como una Application o un Progress que no lo es?

(En realidad, dado que usted es el parent pasa como un argumento de palabra clave, es solo una coincidencia que resultó estar en la 4ª posición en su llamada al constructor wx.ProgressDialog y también en la 4ª posición de la llamada al subyacente Función de C ++, que es lo que realmente se queja. Obtendría el mismo error si cambiara el maximum y el parent , y creo que todavía diría el argument 4 lugar del argument 3 ).

Para verificar esto, intente eliminar parent=self en la llamada que falla, y debería funcionar, o agregar parent=object() a la llamada con solo None que funciona, y debería fallar.

Por supuesto que en realidad no soluciona el problema. Pero para hacer eso, tienes que descubrir qué querías que fuera el parent y pasarlo en lugar de self .

PD: no creo que el problema tenga nada que ver con tu enhebrado.