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()