Pregunta

Tengo un problema con hilos en pygtk. Mi aplicación consiste en un programa que descarga imágenes de Internet y luego las muestra con pygtk. El problema es que para hacer esto y mantener la GUI receptiva, necesito usar hilos.

Así que recibí una devolución de llamada después de que el usuario hizo clic en el botón "Descargar imágenes" y llamo al método para descargar las imágenes que están dentro de esa misma clase.

thread.start_new_thread (self.images_download, (ruta, páginas)

Esto no funcionará. La única forma en que hago que mi programa ingrese al hilo es usando

gtk.threads_init ()

Antes de comenzar cualquier hilo. Ahora descarga las imágenes, pero la GUI no responde. Busqué en Google esto e intenté poner gtk.threads_enter y gtk.threads_leave alrededor de los hilos pero simplemente no funciona.

¿Fue útil?

Solución

Su pregunta es un poco vaga, y sin una referencia a su código real es difícil especular qué está haciendo mal.

Así que te daré algunos consejos para leer, luego especularé salvajemente según la experiencia.

En primer lugar, parece pensar que solo puede mantener la GUI receptiva mediante hilos. Esto no es verdad. También puede escribir su código de forma asincrónica y hacer todo en una aplicación de subproceso único. Twisted se basa en este modelo de programación. Recientemente hice una publicación de blog que explica cómo creé una interfaz de tarea asíncrona, y un ejemplo corredores tanto para CLI como para GTK +. Puede ver esos ejemplos para ver cómo las tareas se pueden implementar de forma asíncrona y la interfaz de usuario aún se actualiza.

Segundo, si prefiere usar hilos por algún motivo, necesitará comprender un poco el modelo de hilos GTK +.

Debería comenzar leyendo la entrada de preguntas frecuentes de PyGTK sobre el tema , y puede encontrar esta publicación de blog fácil de entender también.

Ahora, a la especulación. Supongo que está intentando actualizar su interfaz de usuario GTK desde el hilo y no está manejando el bloqueo correctamente. Si este es el caso, es mejor que por ahora difiera todas las actualizaciones de la interfaz de usuario que desee hacer de los subprocesos al subproceso principal utilizando gobject.idle_add () De esta manera, todas las llamadas de la IU se realizarán desde el subproceso principal. Es un modelo mental más fácil de seguir en su programación.

Una vez que sienta que realmente comprende los modelos de subprocesos y bloqueos, podría considerar actualizar la interfaz de usuario de sus subprocesos, pero es fácil pasar por alto un threads_enter () / threads_leave ()

Otros consejos

Puede usar gtk.gdk.threads_init () para permitir que cualquier hilo modifique la IU con el respectivo bloqueo gtk.gdk.threads_enter () y gtk.gdk.theads_leave (), pero el problema con esto es que No funciona bien en Windows. Lo he probado en Linux y funciona bastante bien, pero no tuve suerte de que esto funcione en win32.

=== Editar ===

He estado navegando sobre esto, puede usar gobject.io_add_watch para verificar si hay algo en su socket, tomarlo y luego actualizar la GUI. mira mi post sobre esto: Sockets (y algunos otros archivos) y PyGTK sin hilos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top