Python Pyqt5 Loop Funktion?

1 Antwort

Wie man einen QThread nutzen kann, habe ich hier schon einmal gezeigt.

Alternativ findest du ein Beispiel mit einem QThreadPool und QRunnable in dem Blogartikel von Martin Fitzpatrick.

Dreaon 
Fragesteller
 08.08.2022, 21:01

Hallo,

danke dir für deine Antwort.

Also ich habe deine Antwort soweit durch gelesen und selbst probiert. Allerdings bekomme ich es nicht so hin, wie ich es gerne hätte. Im Prinzip nur Errors. Ich bin was PyQt betrifft noch ein ziemlicher Anfänger und hätte nicht gedacht das ein einfacher loop solche Schwierigkeiten mit sich bringt.

Vielleicht schildere ich dir kurz meine GUI Code Struktur. Möglicherweise hast du da ein Tipp. Es gibt ein Main File , welches sowohl auf die ui_main (die eigentliche GUI) als auch auf eine ui_function Datei, worin sich alle Funktionen befinden verweist, welche ich in der Maindatei mit z.B. aus der ui_main gezogene Buttons anspreche. Einer dieser Buttons soll in der ui_function Datei ein importiertes Skript im loop starten und ein anderer wieder stoppen. Ich habe versucht mit einer Work klasse zu arbeiten, aber leider vergebens. Dazugesagt arbeite ich noch nicht lange mit Python weshalb ich das mit dem loop und der GUI eventuell unterschätzt habe, aber möchte gerne, dass es funktioniert.

Hast du da ggf. Idden? Gerne kann ich ein teil des codes hier teilen.

0
regex9  09.08.2022, 14:20
@Dreaon

Bezüglich der Fehler, auf die du wohl stößt, kann ich nichts sagen. Da müsstest du mehr Informationen teilen. Ebenso ist noch offen, wieso du ein Skript importieren musst und was es denn genau tut (Lädt / verarbeitet es bspw. große Datenmengen? Inwiefern kommuniziert es mit der GUI?).

Sofern das auszuführende Skript separat von der Anwendung könnte ein eigener Subprozess besser sein, da das Skript dann in einem eigenen Interpreter laufen würde.

0
Dreaon 
Fragesteller
 10.08.2022, 14:03
@regex9
Hallo regex9, erstmal viellen Dank, dass du dir für mein Problem die Zeit nimmst.

Also ich hab mich nochmal dran versucht und es geschafft den loop über den start button zu starten, der stop button funktioniert noch nicht aber mal gucken woran es liegt.Jetzt hab ich aber noch eine frage, die ein teil deiner Fragen eventuell beantwortet. Also durch den loop wird eine funktion in einem importierten skript gestartet. Diese Funktion durchsucht die aktuellen Systemprozesse und gleicht sie mit einer SQL Datenbank ab. Jenach ergebnis, gibt die funktion return werte zurück, die ich dazu nutzen möchte die Labels in der GUI zu verändern. Aktuell ist es so, dass die Funktion im loop ausgeführt wird und die korrekten rückgabewerte mir ausgibt. Es fehlt nur noch die Änderung der Labels. Hier kommt meine Frage ins spiel. Scheinbar funktioniert das einfache ansprechen des Labels nicht in der Worker Klasse (Bspl: self.ui.currentScanStatus_label.setText("test")). Kann ich durch ein Signal die Änderung eines labels bewerkstelligen?
0
Dreaon 
Fragesteller
 10.08.2022, 14:08
@Dreaon

Nochmal in normaler Formatierung :D

Hallo regex9, erstmal vielen Dank, dass du dir für mein Problem die Zeit nimmst.

Also ich hab mich nochmal dran versucht und es geschafft den loop über den start button zu starten, der stop button funktioniert noch nicht aber mal gucken woran es liegt. Jetzt hab ich aber noch eine frage, die ein teil deiner Fragen eventuell beantwortet. Also durch den loop wird eine Funktion in einem importierten Skript gestartet. Diese Funktion durchsucht die aktuellen Systemprozesse und gleicht sie mit einer SQL Datenbank ab. Jenach Ergebnis, gibt die Funktion Return werte zurück, die ich dazu nutzen möchte die Labels in der GUI zu verändern. Aktuell ist es so, dass die Funktion im loop ausgeführt wird und die korrekten rückgabewerte mir ausgibt. Es fehlt nur noch die Änderung der Labels. Hier kommt meine Frage ins spiel. Scheinbar funktioniert das einfache ansprechen des Labels nicht in der Worker Klasse (Bspl: self.ui.currentScanStatus_label.setText("test")). Kann ich durch ein Signal die Änderung eines Labels bewerkstelligen?

0
regex9  10.08.2022, 15:50
@Dreaon

Die Worker-Klasse läuft im Thread und der teilt erst einmal nicht den Scope mit dem Mainthread. Das heißt, er kennt deine UI-Komponenten nicht. Der Weg geht hierbei definitiv über Signals-and-Slots. Wenn du dir noch einmal meine Antwort durchliest, die ich oben verlinkt habe, findest du dazu auch ein Beispiel.

Sofern du das bisher nicht getan hast, würde ich außerdem empfehlen, zu schauen, inwiefern man die Rate an Leseprozessen reduzieren kann. Wenn du beispielsweise weißt, dass sich die Datenbank nicht ständig ändert, kann das gelesene ResultSet für eine gewisse Zeit gecached und bis zum nächsten fälligen Lesevorgang für die Vergleiche verwendet werden.

0