2010-01-14 4 views

Antwort

12

GTK + ist nicht Thread-sicher, daher sollten Sie GUI-Aktualisierungsmethoden nicht einfach von anderen Threads aufrufen. glib.idle_add (oder gobject.idle_add in älteren PyGTK-Versionen) kann für diesen Zweck verwendet werden.

Statt zu schreiben:

label.set_text("foo") 

würden Sie schreiben:

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

, die den Funktionsaufruf verursacht in GTK + in der Warteschlange.

Wenn Sie mehrere Anweisungen ausgeführt werden müssen, ist es oft einfacher, sie in einer Funktion zu wickeln:

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

Vergewissern Sie sich, dass die Funktion zu idle_add bestanden hat True nicht zurück; Andernfalls wird es erneut in die Warteschlange gestellt.

Bearbeiten: Wie Daniel darauf hingewiesen, müssen Sie zuerst gtk.gdk.threads_init() irgendwo in Ihrem Programm aufrufen.

-1

das gleiche mit gobject.idle_add Verfahren erreicht werden kann, deren Syntax ist gleich wie oben, müssen Sie das Modul importieren gobject

2

Wie in den vorangegangenen Antworten angegeben, GTK nicht „Thread-sicher“, aber es ist "thread-aware" - siehe diese Seite auf Threads: https://developer.gnome.org/gdk2/stable/gdk2-Threads.html

Um GTK-Widgets von einem anderen Thread zu ändern, müssen Sie GTK-Locking verwenden. Rufen Sie gtk.threads_init() unmittelbar nach dem GTK-Modul importieren, und dann können Sie aktualisieren, wie so:

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

Beachten Sie, dass die oben wird unter Windows nicht funktionieren (siehe Link oben). Unter Windows müssen Sie gobject.idle_add() wie oben beschrieben verwenden, vergessen Sie aber nicht, gobject.threads_init() direkt nach dem Import von gobject in Ihrem Code zu setzen! Die Funktion idle_add() führt das Update selbst im Haupt-Thread aus (der Thread, der gtk.main() ausführt).

+0

Guter Punkt. Ein weiterer guter Bericht zu diesen beiden Ansätzen ist in einem PyGTK FAQ-Eintrag zu finden: http://faq.pygtk.org/index.py?file=faq20.006.htp&req=show –

-1

Was Johannes gesagt hat, ist korrekt, aber da GTK ein Wrapper für die Dinge glib und gobject ist, möchten Sie eigentlich gtk.idle_add() verwenden. Keine Notwendigkeit für die unnötigen Importe.

Verwandte Themen