Tras mucho tiempo buscando la solución, hoy la he encontrado en stack overflow.
Una solución simple es llamar constantemente a este código dentro de la función que queremos llevar a cabo.
while Gtk.events_pending():
Gtk.main_iteration()
Esto a veces no es posible. Para hacerlo sin lo anterior, necesitamos usar elementos que la librería Gtk nos ofrece. La función clave que realiza esto es GObject.idle_add(callback,[args])
. Aún así también necesitaremos usar elementos como los threads de python para llevar a cabo nuestro objetivo. Os dejo un ejemplo del código funcional.
# Initialize spinner
spinner.start()
def runthread():
# FUNCION A LLEVAR A CABO: pensando()
resultado = pensando(cerebro)
# Función "mágica" de Gtk
GObject.idle_add(finalizado,resultado)
def finalizado(resultado):
# parar el spinner
spinner.stop()
# Join thread
th.join()
# Llamar al callback
funcion_callbk(resultado)
# Call to threading
th = threading.Thread(target=runthread)
th.start()
La función callback (funcion_callback
) va a ser la función que se ocupe de recibir el resultado proporcionado por la función cerebro
. Este es el resultado final que deberíais tener dentro de vuestro código.
Además, a la hora de llamar a Gtk, deberemos añadir estas funciones para que estos cambios tengan efecto: GLib.threads_init() y GObject.threads_init(). Entre ellas deberemos colocar la función Gtk.main()
PD: Sí, esta ha sido la causa del retraso de la versión 0.3 de pimagizer.
Saludos 😉
Lo pusiste en práctica? Yo no lo entiendo muy bien que digamos, pero seguí la lógica, hice un programa… y no funciona! Help 🙂
Sí, lo puse en práctica con el programa Pimagizer (v0.3) (mira pimagizer/gtkpimagizer.py en lp:pimagizer).
La verdad, ayudaría mucho si pusieras la parte del programa que te da problemas. Consulta documentación de Python para entender cómo funcionan los threads y la de GTK para saber cómo funciona la función Gtk.idle_add(): Es la CLAVE de todo.
Saludos 😉
Mirá, justo antes de que me respondas (mientras curioseaba tu blog) encontré tu programa Pimagizer y me puse a ver el código. Ahí vi que en la función main() vos usás GLib.threads_init() y GObject.threads_init(), dejando a Gtk.main() en el medio de las otras dos. Hice eso y funcionó, acá podés ver el código de ejemplo que escribí: http://ur1.ca/egu5g.
Tengo mucho que aprender de Python, Gtk+ y sobre los threads también, así que ese será mi próximo paso. También voy a ver si puedo implementar el Spinner del ejemplo en mi programa real.
Muchas gracias por todo! Saludos! 😛
Germán.
Cierto, quizás me faltó añadir eso!. ¡Muchas gracias por avisar! y ¡Saludos!. (Edito:) Por cierto, me añado tu blog a mi blogroll, está muy bien!
Es una honra!
Voy a seguir usando tu blog para aprender!
Abrazos!