J'utilise PYGTK pour créer une application d'interface graphique. Je veux mettre à jour le widget TextView d'un autre thread, mais le widget ne se met pas à jour chaque fois que j'essaie une mise à jour. Que dois-je faire pour obtenir une intervention graphique fiable? P>
4 Réponses :
GTK + n'est pas thread-coffre-fort, vous ne devez donc pas simplement appeler des méthodes de mise à jour de l'interface graphique à partir d'autres threads. glib.idle_add (ou gobject.idle_add Dans les versions pygtk plus anciennes) peuvent être utilisées à cet effet.
au lieu d'écrire: p> vous écririez: p> def idle():
label1.set_text("foo")
label2.set_text("bar")
glib.idle_add(idle)
La même chose peut être obtenue à l'aide de la méthode GOBJECT.IDLE_ADD dont la syntaxe est la même que ci-dessus, vous devez importer le module GOBJECT P>
Comme indiqué dans les réponses précédentes, GTK n'est pas "Safe Safe", mais c'est "Thread-Cays" - voir cette page sur les threads: https://developer.gnome.org/gdk2/stable/gdk2-threads.html
afin de modifier les widgets GTK de Un autre fil que vous devez utiliser le verrouillage de GTK. Appeler Notez que ce qui précède ne fonctionnera pas sous Windows (voir le lien ci-dessus). Sous Windows, vous devez utiliser gtk.threads_init () code> immédiatement après l'importation du module GTK, puis vous pouvez mettre à jour comme: P>
gobject.idle_add () code> comme expliqué ci-dessus, mais n'oubliez pas de mettre
gobject.threads_init () code> directement après avoir importé gobject dans votre code! La fonction IDLE_ADD () exécutera la mise à jour elle-même dans le fil principal (le fil exécutant GTK.MAIN ()). P> P>
Bon point. Une autre bonne réduction concernant ces deux approches peut être vue dans une entrée de la FAQ pygtk: FAQ.PYGTK.ORG/INDEX.PY?FILE=FAQ20.006.HTP&REQ=SHOW
Qu'est-ce que Johannes a dit que Johannes est correct, car GTK est une enveloppe pour la glib et les choses GOBJECT, vous souhaitez réellement utiliser gtk.idle_add (). Pas besoin des importations inutiles. P>