[Python-de] pyQt4 QTextEdit

Andreas Pakulat apaku at gmx.de
Sa Aug 9 19:01:36 UTC 2008


On 09.08.08 15:13:37, Uwe Wilske wrote:
> Ich nutze ein QTextEdit zur Anzeige, um den Fortschritt bei kopieren von  
> Bildern von der Kamera auf die Festplatte anzuzeigen. Nach jedem  
> Kopiervirgang rufe ich meine Anzeigefunktion auf:
>
>     def anzeige(self,s):
>         self.me_Status.append(s)
>         print s
>
> Das print s wird sofort angezeigt, das 'self.me_Status.append(s)' jedoch  
> erst, wenn alle Kopiervorgänge abgeschlossen sind. Wie kann ich die  
> sofortige Anzeige erzwingen?

Indem du dem Event-Loop Zeit gibst ein paar Events zu bearbeiten.
Re-Paints erzeugen nur einen neuen Paint event und stecken ihn in die
Event queue, nur wenn der event-loop wieder laeuft werden GUI element
aktualisiert. Mir fallen auf Anhieb 2 Wege ein das ganze hinzubekommen:

- QTimer, lass einfach deine Kopiervorgaenge von einem QTimer starten,
  jedesmal wenn einer fertig ist startest du einen QTimer mit einem
  timeout von 500 ms oder so und laesst in der Zwischenzeit den
  Event-Loop laufen
- das Kopieren in einen separaten Thread auslagern und das melden des
  Fortschritts ueber Queued-Signals oder Events machen

Es gibt auch dir "quick&dirty" Methode, in anzeige() processEvents
aufrufen, das sollte man aber nur machen wenn man weiss was man tut und
sich mit Qt's eventloop gut auskennt. Das bearbeitet unter Umstaenden
mehr events als man moechte (und produziert seltsames, schwer
reproduzierbares Verhalten/Bugs in der Anwendung) und wird
grundsaetzlich nur als letzter Ausweg empfohlen wenn die obigen Methoden
nicht einsetzbar sind.

Andreas

-- 
Your true value depends entirely on what you are compared with.



Mehr Informationen über die Mailingliste python-de