wxpython – hilos y eventos de ventana

Tengo una aplicación wxPython ( http://www.OpenSTV.org ) que cuenta las boletas usando métodos que tienen varias rondas. Me gustaría hacer dos cosas:

(1) Para una gran cantidad de boletas, esto puede ser un poco lento, así que me gustaría mostrarle al usuario un cuadro de diálogo de progreso para que no piense que la aplicación está congelada.

(2) Me gustaría permitir que el usuario rompa los vínculos manualmente, y esto requiere que el código de conteo muestre una ventana de diálogo.

Para lograr (1), creo un hilo para ejecutar el código de conteo, y esto me permite presentar un diálogo de progreso agradable al usuario.

Sin embargo, el problema con esto es que el código de conteo no es el hilo principal, y solo el hilo principal en wxPython puede procesar eventos de ventana.

Supongo que podría crear un hilo para ejecutar el diálogo de progreso en su lugar, pero esto parece incómodo. ¿Hay una mejor manera de lograr tanto (1) como (2)?

Use la Cola para comunicarse y sincronizarse entre los subprocesos, con cada subproceso “propietario” e interactuando exclusivamente con un recurso que no es útil para compartir.

En los kits de herramientas de la GUI donde solo el hilo principal puede realmente manejar la GUI, el hilo principal debe seguir el juego; configure e inicie los subprocesos haciendo el trabajo real, luego no haga nada más que el trabajo de la GUI, utilizando colas para comunicarse con y desde los otros subprocesos .

Para (1), cuando el subproceso de conteo tiene una actualización, debe put en la Cola donde el subproceso principal está esperando; cuando su hilo principal recibe un mensaje adecuado en esa Cola, actualiza el diálogo de progreso.

Para (2), el subproceso de conteo envía la solicitud de “hacer que el usuario rompa un enlace”, el subproceso principal lo recibe y responde adecuadamente, y envía la resolución en una Cola separada.

Entonces, en general, hay dos tipos de comunicaciones: una que no requiere una respuesta, y otras que sí lo hacen. Para el tipo anterior, simplemente coloque la notificación en la cola correspondiente y simplemente proceda, se activará a su debido tiempo. Para el último tipo, mi idioma favorito es poner en la cola apropiada un par (solicitud, response_queue). Si, de lo contrario, las solicitudes idénticas difieren en cuanto a que algunas necesitan una respuesta y otras no, la puesta en cola (solicitud, Ninguna) cuando no se necesita respuesta (y (solicitud, q) donde q es una cola cuando se necesita una respuesta) es agradable , y el lenguaje general, también.

Hay varias formas de llamar al hilo principal wxPython desde un hilo de proceso. El más simple es wx.CallAfter () que siempre ejecutará la función que se le pasa en el hilo principal. También puede usar wx.PostEvent () y hay un ejemplo de esto en la demostración (etiquetado: Temas), y hay varias formas más complicadas pero más personalizables que se discuten en el último capítulo de wxPython en Acción .