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? -- Uwe Wilske
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.
Andreas Pakulat schrieb:
On 09.08.08 15:13:37, Uwe Wilske wrote:
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.
danke für den Tipp. Auf die schnelle habe ich mich für "quick&dirty" Methode entschieden und die auch funktioniert. Was ich nicht verstehe, warum Sie so "dirty" ist. Ich gebe an einer von mir festgelegten Stelle im Programmablauf der Anwendung Zeit die anstehenden Events abzuarbeiten. Da die Anzeige nach dem Kopieren erfolgt, dürfte doch eigentlich nichts passieren: def anzeige(self,s): #Anhängen der Meldung an QTextEdit self.me_Status.append(s) #Der Anwendung Zeit geben die Änderung von QTextEdit anzuzeigen app.processEvents() print s def download(self, aQuellpfad, aZielpfad): self.anzeige('Download beginnt') y = os.listdir(aQuellpfad) y.sort() for dateiname in y: qdn = '%s%s' % (aQuellpfad,dateiname) zdn = '%s%s' % (aZielpfad,dateiname) shutil.copyfile(qdn,zdn) self.anzeige('%s -> %s' % (qdn,zdn)) self.Anzahl=self.Anzahl+1 self.anzeige('%d Dateien kopiert.' % (self.Anzahl)) Im schlimmsten Fall kann das Programm beendet werden, dann ist die letzte Kopie aber bereits abgeschlossen. Oder sehe ich da etwas falsch? -- Uwe Wilske
On 10.08.08 14:23:48, Uwe Wilske wrote:
Andreas Pakulat schrieb:
On 09.08.08 15:13:37, Uwe Wilske wrote: danke für den Tipp. Auf die schnelle habe ich mich für "quick&dirty" Methode entschieden und die auch funktioniert.
Was ich nicht verstehe, warum Sie so "dirty" ist. Ich gebe an einer von mir festgelegten Stelle im Programmablauf der Anwendung Zeit die anstehenden Events abzuarbeiten. Da die Anzeige nach dem Kopieren erfolgt, dürfte doch eigentlich nichts passieren:
Du eroeffnest damit z.B. die Moeglichkeit das der Benutzer was in deiner Applikation macht und du im aktuellen Zustand deiner Applikation nicht darauf reagieren kannst. So koennte es z.B. sein dass der nutzer "irgendwohin" klickt und du bekommst dementsprechend Signale und deine Slots werden aufgerufen. In kleinen ueberschaubaren Applikationen ist das oft kein Problem, aber wenn die Anwendung waechst und damit deren Komplexitaet dann kann sowas schnell zum Problem werden. Denn dann treten Fehler unreproduzierbar und "zufaellig" auf und das Debugging wird schwierig...
Im schlimmsten Fall kann das Programm beendet werden, dann ist die letzte Kopie aber bereits abgeschlossen.
Oder sehe ich da etwas falsch?
In deinem konkreten Fall nicht, meine Warnung war auch mehr allgemeiner Natur da ich ja nicht wusste/weiss wie komplex die Anwendung bei dir ist... Andreas -- You will probably marry after a very brief courtship.
participants (2)
-
Andreas Pakulat
-
Uwe Wilske