Question

J'ai un problème avec les threads dans pygtk. Mon application consiste en un programme qui télécharge des images sur Internet, puis les affiche avec pygtk. Le problème est que pour faire cela et garder l'interface graphique sensible, je dois utiliser des threads.

Je suis donc entré dans un rappel après que l'utilisateur a cliqué sur le bouton "Télécharger les images". et j'appelle la méthode pour télécharger les images qui se trouvent dans cette même classe.

thread.start_new_thread (self.images_download, (chemin d'accès, pages)

Cela ne fonctionnera pas. La seule façon d’obtenir mon programme pour entrer dans le fil de discussion est d’utiliser

gtk.threads_init ()

Avant de commencer un fil. Maintenant, il télécharge les images, mais l'interface graphique ne répond pas. J'ai cherché cela dans Google et j'ai essayé de mettre gtk.threads_enter et gtk.threads_leave autour des discussions, mais cela ne fonctionne tout simplement pas.

Était-ce utile?

La solution

Votre question est un peu vague et sans référence à votre code, il est difficile de spéculer sur ce que vous faites de mal.

Je vais donc vous donner quelques conseils à lire, puis des spéculations basées sur l'expérience.

Tout d'abord, vous semblez penser que vous ne pouvez garder l'interface graphique sensible en utilisant des threads. Ce n'est pas vrai. Vous pouvez également écrire votre code de manière asynchrone et tout faire dans une application à un seul thread. Twisted est construit sur ce modèle de programmation. J'ai récemment publié un article de blog qui explique comment j'ai créé une interface de tâche asynchrone et un exemple. coureurs à la fois pour CLI et GTK +. Vous pouvez consulter ces exemples pour voir comment les tâches peuvent être implémentées de manière asynchrone et que l'interface utilisateur est toujours mise à jour.

Deuxièmement, si vous préférez utiliser les threads pour une raison quelconque, vous devez comprendre un peu le modèle de threading GTK +.

Vous devriez commencer par lire l'entrée de la FAQ PyGTK sur le sujet. , et vous pourriez trouver cet article de blog facile à comprendre aussi.

Passons maintenant à la spéculation. Je suppose que vous essayez de mettre à jour votre interface utilisateur GTK à partir du thread et que vous ne gérez pas le verrouillage correctement. Si tel est le cas, vous feriez mieux de reporter toutes les mises à jour de votre interface utilisateur que vous souhaitez effectuer des threads au thread principal à l'aide de gobject.idle_add (). Ainsi, tous les appels d'interface utilisateur seront effectués à partir du thread principal. C’est un modèle mental plus facile à suivre dans votre programmation.

Une fois que vous sentez que vous comprenez vraiment les modèles de thread et de verrouillage, vous pouvez envisager de mettre à jour l'interface utilisateur à partir de vos threads, mais il est facile de rater un threads_enter () / threads_leave ()

.

Autres conseils

Vous pouvez utiliser gtk.gdk.threads_init () afin de permettre à n'importe quel thread de modifier l'interface utilisateur avec le verrouillage respectant gtk.gdk.threads_enter () et gtk.gdk.theads_leave (), mais le problème avec ceci est que ne fonctionne pas bien sur les fenêtres. Je l’ai testé sous Linux et j’ai très bien fonctionné, mais je n’ai pas eu la chance de le faire fonctionner sous win32.

=== Éditer ===

Je me suis renseigné à ce sujet. Vous pouvez utiliser gobject.io_add_watch pour vérifier s’il ya quelque chose dans votre socket, saisissez-le, puis mettez à jour l’interface graphique. vérifier mon post à ce sujet: Sockets (et quelques autres fichiers) et PyGTK sans thread.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top