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 😉

0 0