Ich verwende PyGTK, um eine GUI-Anwendung zu erstellen. Ich möchte das Textansicht-Widget von einem anderen Thread aktualisieren, aber das Widget wird nicht jedes Mal aktualisiert, wenn ich ein Update versuche. Was muss ich tun, um eine zuverlässige Aktualisierung der GUI zu erhalten?GUI nicht von einem anderen Thread aktualisiert, wenn PyGtk verwendet
Antwort
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.
das gleiche mit gobject.idle_add Verfahren erreicht werden kann, deren Syntax ist gleich wie oben, müssen Sie das Modul importieren gobject
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).
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.
- 1. pygtk gui friert mit Pyjack Thread
- 2. pygtk wie in meinem pygtk GUI
- 3. gtkmm: Update GUI von anderen Thread?
- 4. GUI nicht aktualisiert
- 5. PySide: Einfachere Möglichkeit, GUI von einem anderen Thread zu aktualisieren
- 6. Aufrufmethode auf dem GUI-Thread von einem Timer-Thread
- 7. Wie aktualisiert man Textfelder im Haupt-Thread von einem anderen Thread?
- 8. Aktualisieren von SWT-Objekten von einem anderen Thread
- 9. Warum aktualisiert BackgroundWorker_RunWorkerCompleted GUI nicht?
- 10. Python-GUI (tkinter; pygtk + glade), py2exe
- 11. Label von einem anderen Thread aktualisieren
- 12. Daten von Array aus einem anderen Thread
- 13. Swing GUI: Scrollen nicht aktualisiert, wenn ein JTable größer wird
- 14. Abfangen von Ausnahmen von einem anderen Thread
- 15. Wird eine statusfreie Sitzung von einem anderen Thread verwendet, wenn noch eine asynchrone Methode ausgeführt wird?
- 16. Wie verbessert man das Aussehen und Verhalten von PyGTK GUI?
- 17. Rückgabe von Objekten aus einem anderen Thread?
- 18. Java: Wie erhalte ich InterruptedException in einem Thread, wenn er von einem anderen Thread unterbrochen wird?
- 19. Schließen Haupt von einem anderen Thread
- 20. imshow nicht aktualisiert auf qt gui
- 21. Einfügen in Listenansicht von einem anderen Thread
- 22. JavaFX Aktualisierung UI von einem anderen Thread
- 23. Stop Thread von anderen Thread
- 24. Wie stoppe ich einen Thread von einem anderen Thread
- 25. WPF - Update "System.Windows.Controls.Image" von einem anderen Thread
- 26. Update ListView im Haupt-Thread von einem anderen Thread
- 27. Erwartet googlemock Anrufe von einem anderen Thread
- 28. Zugriff auf Haupt-Thread-Ansichten von einem anderen Thread
- 29. Wie bekomme ich einen Thread-Status von einem anderen Thread?
- 30. ein TreeView Itemssource in einem anderen Thread
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 –