Frage

Ich habe ein Problem mit einem Gewinde in pygtk. Meine Anwendung eines Programms bestehen, die Bilder aus dem Internet herunterlädt und dann zeigt sie mit pygtk. Das Problem ist, dass, um die GUI ansprechbar und immer weiter zu tun, ich brauche Threads zu verwenden.

Also ich in einen Rückruf bekam, nachdem der Benutzer auf die Schaltfläche „Download Bilder“ geklickt und ich rufen Sie die Methode, die Bilder herunterzuladen, die innerhalb derselben Klasse ist.

thread.start_new_thread (self.images_download, (Pfad, Seiten)

Das wird nicht funktionieren. Die einzige Art, wie ich mein Programm kommen in den Thread zu erhalten ist, indem mit

gtk.threads_init ()

Vor jedem Thread starten. Jetzt lädt er die Bilder, aber die GUI bleibt nicht mehr reagiert. Ich googeln dies und ich versuchte gtk.threads_enter und gtk.threads_leave rund um die Themen setzen, aber es funktioniert einfach nicht.

War es hilfreich?

Lösung

Ihre Frage ist ein wenig vage, und ohne einen Hinweis auf Ihren eigentlichen Code ist es schwer zu spekulieren, was Sie falsch machen.

Also habe ich Ihnen einige Hinweise geben, werde zu lesen, dann wild auf Erfahrung spekulieren.

Zunächst einmal, Sie scheinen zu glauben, dass Sie nur die GUI ansprechbar durch Verwendung von Threads zu halten. Das ist nicht wahr. Sie können auch Ihren Code asynchron, und tun alles in einer Singlethread-Anwendung schreiben. Verdrehte wird auf diesem Programmiermodell gebaut. Ich habe vor kurzem eine Blog-Post , die erklären, wie ich eine asynchrone Aufgabe Schnittstelle erstellt und Beispiel Läufer sowohl für CLI und GTK +. Sie können an diesen Beispielen sehen, wie Aufgaben asynchron ausgeführt werden können, und die Benutzeroberfläche wird noch aktualisiert.

Zweitens, wenn Sie Threads lieber aus irgendeinem Grund zu verwenden, müssen Sie das GTK + Threading-Modell ein wenig verstehen.

Sie sollten durch das Lesen The PyGTK FAQ-Eintrag zu diesem Thema starten , und Sie können feststellen dieses Blog-Post leicht zu verstehen.

Nun zu Spekulationen. Ich vermute, dass Sie versuchen, Ihre GTK UI aus dem Thread zu aktualisieren, und die Verriegelung nicht richtig handhaben. Wenn dies der Fall ist, Sie besser dran sind jetzt aufzuschieben alle UI-Updates, die Sie von Threads zu den Haupt-Thread tun wollen, indem Sie gobject.idle_add () Auf diese Weise werden alle UI Anrufe werden von der Haupt-Thread gemacht werden. Es ist ein einfaches mentales Modell in Ihrer Programmierung zu folgen.

Wenn Sie das Gefühl haben wirklich das Einfädeln und Verriegelungs Modelle zu verstehen, könnte man erwägen die Benutzeroberfläche von Threads zu aktualisieren, aber es ist leicht, eine threads_enter () / threads_leave ()

missen

Andere Tipps

Sie können mit gtk.gdk.threads_init (), um einem Thread ändern mit der Respektierung gtk.gdk.threads_enter () und gtk.gdk.theads_leave () Sperre die Benutzeroberfläche ermöglichen, aber das Problem dabei ist, dass funktioniert nicht gut auf Windows. Ich habe es auf Linux getestet und führt ganz gut, aber ich hatte kein Glück diese machen über win32 zu arbeiten.

=== === Bearbeiten

Ich habe über diese gegrast, könnte man die Verwendung des gobject.io_add_watch machen zu überprüfen, ob es etwas in Ihrer Steckdose ist, greift sie und dann die GUI aktualisieren. überprüfen meinen Beitrag dazu: Sockel (und einige andere Dateien) und PyGTK ohne Gewinde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top