TextCtrl flush?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 23. September 2007, 19:12

Ich schreibe, während ein Programm läuft, Informationen mit .AppendText() in ein TextCtrl.
Leider sieht man die Ausgaben erst, nachdem das Programm zuende gelaufen ist.

Gibt es eine Art flush() oder sowas?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 23. September 2007, 19:17

jens hat geschrieben:Leider sieht man die Ausgaben erst, nachdem das Programm zuende gelaufen ist.
Hallo Jens!

Probier mal Refresh() oder Update().

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 23. September 2007, 20:17

Hm. So einfach scheint es nicht zu sein. Mir ist aber aufgefallen, das die ganze GUI nicht bedienbar ist.

Kann es ein, das ich da generell etwas falsch mache? Hab ja ehr weniger mit GUIs zu tun.

Also es ist so: Ich möchte in ein TextCtrl schreiben, zu dem Zeitpunkt, bei der ein Event (Drücken auf den "start" Button) abgearbeitet wird.

Mache ich da evtl. besser ein "Fortschritts-Fenster" mit einem TextCtrl auf?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Sonntag 23. September 2007, 21:17

jens hat geschrieben:Hm. So einfach scheint es nicht zu sein. Mir ist aber aufgefallen, das die ganze GUI nicht bedienbar ist.
Hallo Jens!

Das wird jetzt ein Kulturschock für dich. Gerade dann, wenn du noch nichts mit wxPython gemacht hast und an die Konsolenprogrammierung gewöhnt bist.

Es gibt den Hauptthread. In diesem läuft eine Schleife (MainLoop) die ständig prüft ob es neue Events gibt die abgearbeitet werden müssen. Dazu gehört auch der Aufbau der GUI. Dieser Thread darf nie schlafen gelegt (z.B. mit time.sleep()), oder zur Verrichtung langwieriger anderer Arbeit herangezogen werden. Wenn dieser Thread an irgendeiner Stelle unterbrochen wird, dann wird die GUI nicht neu gezeichnet und auch nicht auf irgendwelche Events reagiert.

Deshalb lässt man "Arbeit" von anderen Threads erledigen.

Wichtig ist dabei nur eines: Greife niemals von einem anderen Thread aus auf etwas zu, was die GUI beeinflussen könnte. Z.B. darfst du nicht von einem anderen Thread aus, direkt etwas in ein wx.StaticText-Widget schreiben. Du brauchst immer einen Vermittler zwischen den Threads.

Der einfachste Vermittler heißt wx.CallAfter(). wx.CallAfter setzt zur Übermittlung Events ein. Aber das ist hier nicht so wichtig.

Leider kann ich dich nicht auf einen einzelnen Beitrag verweisen. Deshalb hier die Themen:
- http://www.python-forum.de/topic-5757.html
- http://www.python-forum.de/topic-7742.html
- http://www.python-forum.de/topic-8609.html
- http://www.python-forum.de/post-49728.html (suche nach "Threading")
- http://www.python-forum.de/topic-10770.html

Ich weiß, das ist ziemlich viel. :roll:

Wenn du noch Fragen hast, einfach fragen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Sonntag 23. September 2007, 21:34

jens hat geschrieben: Mache ich da evtl. besser ein "Fortschritts-Fenster" mit einem TextCtrl auf?
Außerdem würde ich Dir davon abraten - es sei denn Du möchtest Den Nutzern Deines Programs auf diese Weise Detailinformation über den Fortschritt zeigen.

Ansonsten geht eine eigentliche Fortschrittsanzeige mit
ProgressDialog oder Gauge (= progress bar)

und Du hast noch
- Ticker,
- Throbber,
- und u. U. auch die Statusbar.

Ggf. kann man natürlich auch andere Widgets als Fortschrittsanzeige "mißbrauchen", aber ich hoffe ich habe jetzt alle gängigen erwischt.

Gruß,
Christian
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 24. September 2007, 07:36

@gerold: Danke für die Info's und die Links... Die werde ich mir mal näher ansehen...
CM hat geschrieben:
jens hat geschrieben:Mache ich da evtl. besser ein "Fortschritts-Fenster" mit einem TextCtrl auf?
Außerdem würde ich Dir davon abraten - es sei denn Du möchtest Den Nutzern Deines Programs auf diese Weise Detailinformation über den Fortschritt zeigen.
Doch genau das möchte ich. Es werden Dateien verschoben, aber ich möchte das der Anwender nachvollziehen kann, welche Datei wohin gelandet ist ;)

Muß ich für ein separates Fortschrittfenster auch einen seperaten Thread aufmachen?

GUI Programmierung ist ja wieder eine Welt für sich. Dabei wollte ich nur was kleines machen :?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Montag 24. September 2007, 07:56

jens hat geschrieben:Muß ich für ein separates Fortschrittfenster auch einen seperaten Thread aufmachen?
Hallo Jens!

Ein Fenster ist teil der GUI. Deshalb bleibt das Fenster im Hauptthread. Nur der Job, der die Daten liefert, der muss in einen neuen Thread.

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