Saltar al contenido

Cómo hacer funcionar un Gtk.spinner usando Pygobject (Python y Gtk)

Tras mucho tiempo buscando la solución, hoy la he encontrado en stack overflow.

Gtk.Spinner
El spinner en cuestión funcionando

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 😉

5 comentarios en «Cómo hacer funcionar un Gtk.spinner usando Pygobject (Python y Gtk)»

  1. 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 😉

  2. 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.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.