Animar spinner com thread pygtk

2

Eu estou tentando animar um spinner enquanto o programa está em execução, mas não consigo. Eu tentei usar tópicos, mas eu não posso conseguir o que eu quero ... você pode olhar aqui para o progresso que fiz link

eu pego o spinner para animar, mas o programa para de funcionar ...

    
por Clepto 04.07.2012 / 16:23

2 respostas

0

Eu também vi sua pergunta ontem no reddit.

Quando tentei usar threads em python e gtk, demorei uma noite para descobrir.

No final, foi tão simples quanto

GObject.threads_init()
Gdk.threads_init()

no começo e depois gerar tópicos como você faria normalmente em python com algo como

watch_thread = Thread(target=self.function)
watch_thread.daemon = True
watch_thread.start()

Não tenho ideia se isso ajuda você. Mas eu espero que sim. Eu também vou dar uma olhada no seu código e pode editar minha resposta depois:)

    
por wolfv 04.07.2012 / 16:53
1

Continue seguindo as duas dicas ao usar encadeamentos e PyGTK:

  • Certifique-se de chamar GObject.threads_init() o mais rápido possível no seu programa para ativar o encadeamento em seu aplicativo PyGTK.

  • Se você estiver executando alguma tarefa da GUI em seu segmento, coloque-a dentro de GObject.idle_add(callable) , sempre .

Aqui está um exemplo completo de trabalho, adapte-se ao seu código conforme necessário:

import time
import threading

from gi.repository import Gtk, GObject
GObject.threads_init() # Don' forget!


class WorkerThread(threading.Thread):
    def __init__(self, callback):
        threading.Thread.__init__(self)
        self.callback = callback

    def run(self):
        # Simulate a long process, do your actual work here
        time.sleep(4)

        # The callback runs a GUI task, so wrap it!
        GObject.idle_add(self.callback)


class MyWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect('delete-event', Gtk.main_quit)
        self.resize(400, 400)

        vbox = Gtk.VBox()

        button = Gtk.Button("Let's spin!")
        button.connect('clicked', self.on_button_clicked)
        vbox.pack_start(button, False, False, 0)

        self.spinner = Gtk.Spinner()
        vbox.pack_start(self.spinner, True, True, 0)
        self.add(vbox)
        self.show_all()

    def on_button_clicked(self, widget):
        self.spinner.start()
        thread = WorkerThread(self.work_finished_cb)
        thread.start()

    def work_finished_cb(self):
        self.spinner.stop()

if __name__ == "__main__":
    app = MyWindow()
    Gtk.main()
    
por Timo 04.07.2012 / 16:42