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():<br />
    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<br />
spinner.start()</p>
<p>def runthread():<br />
    # FUNCION A LLEVAR A CABO: pensando()<br />
    resultado = pensando(cerebro)<br />
    # Función &quot;mágica&quot; de Gtk<br />
    GObject.idle_add(finalizado,resultado)</p>
<p>def finalizado(resultado):<br />
    # parar el spinner<br />
    spinner.stop()<br />
    # Join thread<br />
    th.join()<br />
    # Llamar al callback<br />
    funcion_callbk(resultado)</p>
<p># Call to threading<br />
th = threading.Thread(target=runthread)<br />
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 😉