Seite 1 von 1

TextCtrl flush?

Verfasst: Sonntag 23. September 2007, 19:12
von jens
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?

Re: TextCtrl flush?

Verfasst: Sonntag 23. September 2007, 19:17
von gerold
jens hat geschrieben:Leider sieht man die Ausgaben erst, nachdem das Programm zuende gelaufen ist.
Hallo Jens!

Probier mal Refresh() oder Update().

lg
Gerold
:-)

Verfasst: Sonntag 23. September 2007, 20:17
von jens
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?

Verfasst: Sonntag 23. September 2007, 21:17
von gerold
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
:-)

Verfasst: Sonntag 23. September 2007, 21:34
von CM
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

Verfasst: Montag 24. September 2007, 07:36
von jens
@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 :?

Verfasst: Montag 24. September 2007, 07:56
von gerold
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
:-)