ProgressDialog beenden

Plattformunabhängige GUIs mit wxWidgets.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Freitag 9. Mai 2008, 17:45

Also bei mir funktioniert es.

Code: Alles auswählen

Das ist meine Umgebung:
=======================
sys.version: 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)]
sys.platform: win32
sys.winver: 2.4
wx.VERSION_STRING: 2.8.6.0
Ich glaube aber, dass (wie bereits anfänglich gesagt) die unterschiedlichen Threads schon von Bedeutung sind. Vielleicht sollte der Worker-Thread doch seinen Arbeitsfortschritt über eine "Variable" an den Hauptthread mitteilen, der diese Variable regelmäßig über einen wxPython-Timer abfragt und den Fortschrittsbalken anpasst.
MfG
HWK
lunar

Freitag 9. Mai 2008, 18:22

Mephisto hat geschrieben:Kann den nicht mal jemand abschalten? :(
Ach, füttern ihn doch einfach nicht...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 9. Mai 2008, 20:22

lunar hat geschrieben:
Mephisto hat geschrieben:Kann den nicht mal jemand abschalten? :(
Ach, füttern ihn doch einfach nicht...
Einfach kurz an die Freundin denken und ignorieren. :wink:
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Freitag 9. Mai 2008, 22:06

maxip hat geschrieben:..., warum funktioniert denn dieser zum obigen Postigng analoger Code nicht ?

...

Abbrechen funktioniert, laeuft der ProgressDialog aber bis zum ende, haengt sich das programm auf :(
Wie ich schon erwähnt habe, darf der ProzessDialog !!! sofern er von einem Thread aus befütter/geupdated wird !!! nicht bis 100% durchlaufen.

Wird das bei der ProgressDialog-Initialisierung gesetzte "maximum" (in unseren Beispielen mit dem Wert 100) erreicht, switcht automatisch der "Cancel"-Button auf "Close" um.

Was genau im Hintergrund der wxWidgets passiert kann ich zum aktuellen Zeitpunkt nicht sagen ... was ich nur weiss ist, dass dieser switch in einem Thread ausgeführt dafür sorgt, dass sich das ganze aufhängt.

Deswegen darf auch das Updaten nur bis zum Punkt 99% erfolgen, gefolgt von einem .Destroy().

Bei HWK scheint es scheinbar auch mit 100% zu funktionieren, ich habs mit Python2.3 getestet, und es hat nicht geklappt.

Unter Verwendung einer Threadgesteuerten Auffüllung des Balkens, war ein destroyen bevor die 100 erreicht war - damit sich das ganze nicht aufhängt - unumgänglich :(

>>Masaru<<
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 10. Mai 2008, 13:42

Hallo!

Es ist sehr schwierig, ein gutes Beispiel für den ProgressDialog zu erstellen. Ich habe es jetzt schon mehrmals versucht, so ein Beispiel dafür zu erstellen, aber irgendwie wird nichts mit dem "einen", einfachen Beispiel. Man kann diesen Dialog nämlich auf viele verschiedene Arten verwenden. Und jede Art fügt sich in die eigene Art zu programmieren ein. Ein Beispiel, das für meine Art zu programmieren ideal ist, kann für andere Programmierer wieder komplett unbrauchbar sein.
Aber eines bleibt immer gleich:
NIEMALS von einem anderen Thread aus, direkt auf wxPython-GUI-Elemente zugreifen.
Auch wenn es auf einem Computer funktioniert, kann es sein, dass es auf dem gleichen Computer mit einem anderen Servicepack oder einer anderen wxPython-Version schon nicht mehr funktioniert. Dann gibt es noch die Unterschiede zwischen Windows, Linux, Gnome, KDE und Mac. Nur wenn man nicht von einem Thread auf den anderen Thread zugreift, kann man halbwegs sicher sein, dass das Programm sinngemäß funktioniert.

Zur Trennung der Threads gibt es verschiedene Wege. Ein sehr einfacher Weg ist der, dass man threadübergreifende Befehle über ``wx.CallAfter()`` aufruft.

Ein anderer Weg ist der, dass man gezielt kapselt, Events auslöst und Handlerfunktionen an die Events bindet. ``wx.CallAfter()`` macht es im Hintergrund so ähnlich.

Und noch etwas: Ob der Dialog bei 100 verschwindet, hat nichts mit den Threads zu tun. Es gibt eine Einstellung (``wx.PD_AUTO_HIDE``) die genau dieses Verhalten erzwingt. Siehe: http://docs.wxwidgets.org/stable/wx_wxp ... ialog.html
Wenn der Dialog dann trotzdem nicht verschwindet, dann wurde falsch programmiert. Und das hat dann vielleicht etwas mit Threading zu tun.

Ich versuche jetzt zwei Beispiele für den ProgressDialog mit Worker-Thread zusammen zu bringen. Wenn ich es schaffe, dann schmeiße ich sie in das Codesnippets-Forum.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 11. Mai 2008, 22:35

Hallo!

Das ist ein (hoffentlich) einfaches Beispiel, ohne große Trennung zwischen Worker-Thread und GUI. Das ist nicht unbedingt empfehlenswert, aber es verdeutlicht, etwas einfacher durchschaubar, dass man Regeln einhalten muss, wenn man Threads und die GUI (die im Hauptthread läuft) miteinander kommunizieren lassen möchte.

http://www.python-forum.de/post-98784.html

Das nächste Beispiel verdeutlich, wie man eine Trennung zwischen Worker-Thread und GUI vewirklichen könnte. Eine recht einfache Möglichkeit: Man übergibt beim Erstellen des Worker-Threads eine Funktion die vom Thread laufend aufgerufen wird. Diese Funktion ruft über wx.CallAfter eine andere Funktion auf, die sich darum kümmert, dass der ProgressDialog einen neuen Wert bekommt. Außerdem wird auch abgefragt, ob der Benutzer den "Abbruch"-Button gedrückt hat. Wenn Ja, dann wird der Thread abgebrochen.

http://www.python-forum.de/post-98790.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten