7
votes

Interface graphique non mise à jour d'un autre fil lors de l'utilisation de pygtk

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?


0 commentaires

4 Réponses :


14
votes

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> xxx pré>

vous écririez: p>

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


0 commentaires

-1
votes

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


0 commentaires

2
votes

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 gtk.threads_init () immédiatement après l'importation du module GTK, puis vous pouvez mettre à jour comme: xxx

Notez que ce qui précède ne fonctionnera pas sous Windows (voir le lien ci-dessus). Sous Windows, vous devez utiliser gobject.idle_add () comme expliqué ci-dessus, mais n'oubliez pas de mettre gobject.threads_init () 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 ()).


1 commentaires

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



-1
votes

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.


0 commentaires