Textausgabe im GUI

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Scorch
User
Beiträge: 2
Registriert: Mittwoch 9. März 2022, 23:23

Hallo erst einmal

Ich habe mich gerade erst angemeldet, weil ich trotz vielem Lesen und Youtube-Videos schauen nicht weiterkomme.
Um es vorweg zu nehmen: Ich bin noch nicht sonderlich tief in der Materie, wie sich bald an meiner Frage schon zeigen wird.

Nach ca. zwei Jahren habe ich ein altes Projekt wieder ausgegraben und es überarbeitet (verbessert).
Soweit so gut, im großen und ganzen macht es was es soll. Nun, als nächsten Schritt möchte ich das mit einer GUI (pyside6)
verknüpfen. Auch das funktioniert mehr oder weniger, will sagen: Da kämpfe ich mich schon noch durch.
Ich hätte nie gedacht, dass ich wegen so einer Kleinigkeit nicht weiterkomme:
Das, was bisher in der Konsole angezeigt wurde (z.B. welche Datei gerade kopiert wird) wollte ich in der GUI anzeigen lassen.
Fehlanzeige. Angenommen es werden 5 Dateien kopiert, dann wird mir erst danach etwas angezeigt, und dann nur die letzte Datei.
Um dem Problem auf die Schliche zu kommen habe ich mir sogar ein einfaches estprogramm mit Testgui etc. erstellt,
aber selbst bei einer Behfehlsfolge von z.B.

self.textBrowser.setText("Text 1")
time.sleep(3) # damit ich das mitbekomme, falls der Text1 durch Text2 einfach nur überschrieben wird
self.textBrowser.setText("Text 2")

wird mir nur der Text "Text 2" angezeigt.
Vermutlich fehlt mir da irgendwas Grundlegendes, das wahrscheinlich nicht mal sehr schwer wäre, wenn man weiß wie.
Kann man nicht einfach das, was normal in der Konsole angezeigt wird irgendwie im GUI anzeigen?
Naja, vermutlich schon, aber wie?
Wäre super wenn mir da jemand weiterhelfen könnte. Probiere da echt schon mehrere Tage rum.
Vielen Dank.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

GUI Programmierung ist nicht einfach und komplex. Programme werden dort nicht rein sequentiell abgearbeitet, sondern durch Events gesteuert.
Jedes mir bekannte GUI Framework besitzt einen mainloop, der nicht unterbrochen werden darf. Der sorgt dafür, dass die Oberfläche gezeichnet wird. Wird er unterbrochen bekommst du unter Windows das berühmte "das Programm reagiert nicht mehr".
Was du hier tust: Du änderst etwas an der GUI, lässt den mainloop schlafen, änderst danach wieder etwas und erst dann kommt der mainloop wieder dort an, wo die GUI gezeichnet wird.

Wenn du längere Dinge ausführen willst, musst dich damit Beschäftigen, wie Nebenläufigkeiten in Qt funktionieren und du musst dich mit Signalen beschäftigen, denn darüber wirst du die Infos für die Aktualisierung der GUI emitten müssen.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Scorch: Das ist das übliche Problem: Entweder läuft Dein Code, zum Beispiel in einer Schleife oder `sleep()` — dann ist die GUI ”tot”, das heisst das ändert sich nichts in der Anzeige und es kann auch nicht auf den Benutzer reagiert werden. Oder es läuft die GUI-Hauptschleife — dann läuft natürlich nichts von Dir. Rückrufe von der GUI dürfen immer nur *kurz* etwas machen.

Du musst dann entweder mit so etwas wie `QTimer` arbeiten und Deine Aufgabe auf viele Aufrufe verteilen die immer ein kleines bisschen machen/berechnen/…, oder einen Worker-Thread aufsetzen, der dann aber nichts an der GUI verändern darf, sondern über Signale mit dem GUI-Thread kommunizieren muss.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Scorch
User
Beiträge: 2
Registriert: Mittwoch 9. März 2022, 23:23

Hm, merke schon, die angedachte Richtung war schon nicht verkehrt.
Ich war tatsächlich schon richtung Thread unterwegs.
Hatte was von einer Art Main-Thread und Worker-Thread gelesen.
Der Worker-Thread bearbeitet wohl die zeitintensiveren Sachen.
Und dann die Geschichte mit den Signalen, da werde ich mich wohl noch mehr damit
beschäftigen müssen. Ich vermute mal, dass ich im Programm Dinge bearbeiten / berechnen lasse und
dann an bestimmten Punkten über Signale der Gui mitteile das darzustellen.
Also an Hartnäckigkeit soll es nicht scheitern, sonst hätte ich nicht erst mehrere Tage rumprobiert,
aber hättet ihr vielleicht ein paar Links zu guten Tutorials zu dem Thema?
Klar kann ich danach googeln und finde bestimmt einiges, aber davon gibt es sicher auch
ein paar Suchvorschläge, die man sich schenken kann.
Merke schon, das ganze in ein GUI zu implementieren ist nochmal eine ganz andere Nummer,
aber echt interessant.
Über ein paar Vorschläge würde ich mich freuen. Schon mal vielen Dank.
Antworten