2010-01-14 18 views

Odpowiedz

12

GTK + nie jest wątkowo bezpieczny, więc nie powinieneś po prostu wywoływać metod aktualizacji GUI z innych wątków. glib.idle_add (lub gobject.idle_add w starszych wersjach PyGTK) mogą być używane do tego celu.

Zamiast pisać:

label.set_text("foo") 

byłoby napisać:

glib.idle_add(label.set_text, "foo") 

co powoduje wywołanie funkcji w kolejce w GTK +.

Jeśli trzeba uruchomić wiele instrukcji, często łatwiej owinąć je w funkcję:

def idle(): 
    label1.set_text("foo") 
    label2.set_text("bar") 
glib.idle_add(idle) 

upewnij się, że funkcja przekazywane idle_add nie zwraca True; w przeciwnym razie będzie ponownie w kolejce.

Edytuj: Jak zauważył Daniel, najpierw musisz zadzwonić pod numer gtk.gdk.threads_init() w dowolnym miejscu programu.

-1

samo można osiągnąć stosując metodę gobject.idle_add którego składnia jest taka sama jak wyżej, trzeba importować moduł gobject

2

Jak wspomniano w poprzednich odpowiedziach, GTK nie jest „wątek bezpieczne”, ale to jest "wątku" - zobacz tę stronę w wątkach: https://developer.gnome.org/gdk2/stable/gdk2-Threads.html

Aby zmodyfikować widżety GTK z innego wątku, musisz użyć blokady GTK. Zadzwoń gtk.threads_init() natychmiast po zaimportowaniu modułu gtk, a następnie można aktualizować tak:

gtk.threads_enter() 
# make changes... 
gtk.threads_leave() 

Należy zauważyć, że powyższe nie będzie działać w systemie Windows (patrz link powyżej). W systemie Windows musisz używać gobject.idle_add(), jak wyjaśniono powyżej, ale nie zapomnij umieścić gobject.threads_init() bezpośrednio po zaimportowaniu gobject do kodu! Funkcja idle_add() wykona samą aktualizację w wątku głównym (wątku z uruchomionym gtk.main()).

+0

Dobra uwaga. Kolejny dobry zapis dotyczący tych dwóch podejść można znaleźć w wpisie PyGTK FAQ: http://faq.pygtk.org/index.py?file=faq20.006.htp&req=show –

-1

To, co powiedział Johannes, jest poprawne, jednak ponieważ GTK jest opakowaniem dla rzeczy glib i gobject, naprawdę chciałbyś użyć gtk.idle_add(). Nie ma potrzeby niepotrzebnego importu.

Powiązane problemy