Używam PyGTK do budowania aplikacji GUI. Chcę zaktualizować widżet widoku tekstowego z innego wątku, ale widget nie jest aktualizowany za każdym razem, gdy próbuję aktualizacji. Co powinienem zrobić, aby zaktualizować GUI?GUI nie zaktualizowano z innego wątku podczas korzystania z PyGtk
Odpowiedz
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.
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
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()).
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.
- 1. Zatrzymaj GUI Pygtk przed blokowaniem podczas długotrwałego procesu
- 2. Metoda uruchamiania głównego wątku z innego wątku
- 3. Obiekt dostępu z innego wątku
- 4. GUI do korzystania z Hadoop
- 5. Jak zaktualizować GUI z wątku używając Delphi
- 6. Metoda wywołania na wątku GUI z wątku timerów
- 7. Synchronizacja wątku kakaowego podczas korzystania z [ALAssetsLibrary enumerateGroupsWithTypes:]
- 8. Uzyskiwanie przerwania wątku Wyjątek podczas korzystania z funkcji Response.Redirect()
- 9. Jak zarządzać wątku lokalnego magazynu (TLS) podczas korzystania z TPL?
- 10. Otwórz plik GUI z innego pliku pyqt
- 11. Jak pracować z wątkami w pygtk
- 12. C#: Pokaż okno dialogowe na wątku UI z innego wątku
- 13. Wywoływanie metod @Transactional z innego wątku (Runnable)
- 14. Oczekiwanie połączeń googlemock z innego wątku
- 15. Aktualizowanie obserwowalnej kolekcji z innego wątku
- 16. Drukowanie śledzenia stosu z innego wątku
- 17. Jak dotknąć EditTextPrefences z innego działania lub innego wątku
- 18. Gwint WPF i GUI jak uzyskać dostęp do obiektu z innego wątku?
- 19. nanosleep() wywołanie z skryptu Lua przerwanego wątku QT GUI
- 20. Ustaw priorytet wątku GUI w Qt
- 21. Cytaty podczas korzystania z grep?
- 22. Błąd podczas korzystania z formularza.submit()
- 23. Uruchamianie kodu wewnątrz innego wątku w javascript
- 24. keyDispatchingTimedOut podczas korzystania z emulatora
- 25. Nullpointer podczas korzystania z response.sendRedirect()
- 26. coś jak equalsIgnoreCase podczas korzystania z indexOf
- 27. Zakleszczenie podczas wywoływania wątku interfejsu użytkownika z wątku roboczego
- 28. Połączenie nie ma limitu czasu podczas korzystania z Indy
- 29. Jak śledzić postępy podczas korzystania z Kanban?
- 30. Uzyskanie wyniku śledzenia innego wątku
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 –