Wie kann ich meine GUI updaten?

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
marie1995
User
Beiträge: 2
Registriert: Freitag 31. Mai 2019, 20:30

Hi :wink:

Ihr seid jetzt gefühlt meine letzte Hoffnung :cry: Habe mir unzählige Youtube Tutorials angeschaut, Stack Overflow Beiträge durchgelesen und die Docs zu QtObject, emit, sender, pyqtSignal, ... durchgelesen aber kriege es nicht hin.

Mein GUI Code läuft im Main Thread, mein "logischer Code" läuft in einem zweiten Thread, da meine GUI sonst freezed. Ich will jetzt z.B. eine TextBox oder eine ProgressBar jede Sekunde updaten, somit dynamisch mit Informationen füttern. :lol:
Ich könnte euch jetzt meine Code-Versuche hier zeigen aber das würde euch nichts bringen. Ich bin mir fast sicher, dass es nicht so schwierig ist, wie ich mir das ausmale. Habe Python angefangen und sehr schnell Erfolge erzielt und schon für mich schon echt coole Programme erstellt aber GUI Programmierung scheint echt ein anderes LVL zu sein, vor allem wenn man halbwegs aufwendigere Codes mit der GUI verbinden möchte.

Um das jetzt mal auf eine Frage zu reduzieren: Wie kann ich meine GUI Elemente dynamisch mit Informationen aus einem anderen Thread füttern?

Und das ist mein erster Beitrag, fühlt euch gegrüsst :ugeek: Bin für jede Hilfe sehr dankbar!
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Code ist durchaus relevant. Denn bei mult-threading kommt’s auf Details an. Grundsätzlich musst du aus dem Hintergrund-Thread ein Signal verschicken. Aber das wichtige ist, dass es sich dabei um eine queued connection handelt, damit die GUI-Arbeit tunlichst nicht anders als vom Main Thread ausgeführt wird. Sonst kracht es.
marie1995
User
Beiträge: 2
Registriert: Freitag 31. Mai 2019, 20:30

__deets__ hat geschrieben: Freitag 31. Mai 2019, 21:22 Der Code ist durchaus relevant. Denn bei mult-threading kommt’s auf Details an. Grundsätzlich musst du aus dem Hintergrund-Thread ein Signal verschicken. Aber das wichtige ist, dass es sich dabei um eine queued connection handelt, damit die GUI-Arbeit tunlichst nicht anders als vom Main Thread ausgeführt wird. Sonst kracht es.
Danke für deine schnelle Antwort. Ich glaube ich habe das Problem jetzt tatsächlich nach mehreren Tagen Kopfzerbrechen gefunden.

Ich wollte nämlich per For Loop eine TextBox mit 50+ Wörtern füllen. Mit 25 Wörtern hat es auch noch funktioniert aber mit 50 nicht mehr. Deswegen habe ich einfach time.sleep(0.2) nach jedem einfügen in die Schleife geschrieben und jetzt funktioniert es wunderbar.
Aber nach dem was ich die letzten Tage alles gelesen habe dürfte es eigentlich nicht funktionieren, da der MainThread (GUI) ja eigentlich nicht mit anderen Nicht-Main-Threads kommunizieren kann ohne dabei PyQT Sender/Emitter Sachen zu benutzen...
Und was meinst du mit Queued Connection?

MfG!
Marie
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist halt das Problem, wenn man Threads nicht korrekt verwendet, dann macht man irgendein bißchen Magie und glaubt, eine Lösung gefunden zu haben. Ist aber nicht so, das ist nur Zufall, dass das scheinbar funktioniert.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich verstehe den Zusammenhang zwischen befüllen eines Widgets und sleep nicht. Wenn du aus irgendwelchen Gründen etwas verzögert machen willst, sind eher QTimer deine Lösung.

Queued connections sind erklärt in der offiziellen Qt Dokumentation. In Kurzfassung können sie zwischen verschiedenen Event Loops ausgetauscht werden, womit ein Signal aus einem Thread im main thread landet. Es gibt auch Beispiele dazu in der Qt Doku, die das erklären. In C++, aber darum das so grob zu lesen und zu verstehen kommt man bei Qt eh nicht herum.

Und nochmal: Code sagt mehr als tausend Worte. Wir können deutlich besser beurteilen, was du tust, wenn du es uns zeigst.
Antworten