Seite 1 von 1

"Keine Rückmeldung"

Verfasst: Mittwoch 8. Juni 2022, 11:04
von Neu111
Hallo,
meine Anwendung (Python Script mit wx-Oberfläche als exe-Datei) startet auf Knopfdrück zahlreiche http-requests (10 und mehr), und liefert anschließend das Ergebnis zurück.
Soweit funktioniert alles.
Was mich aber stört: während die Abfragen (http-requests) im Hintergrund laufen, zeigt das Frontend (also die grafische Benutzeroberfläche) in der Titelleiste die Meldung "keine Rückmeldung".
Eigentlich möchte ich nach jeder erfolgreichen http-Abfrage im Frontend einen Zwischenstatus einblenden. Sobald aber ""keine Rückmeldung" erscheint, hängt das komplette Frontend.
Gibt es für mein Problem eine Lösung?
Vielen Dank!

Re: "Keine Rückmeldung"

Verfasst: Mittwoch 8. Juni 2022, 11:07
von noisefloor
Hallo,

wie setzt du die Requests denn ab? Nach deiner Beschreibung zu urteilen blockierst du dir selber den Mainloop der GUI.

Zeig' doch mal die relevanten Codeabschnitte.

Gruß, noisefloor

Re: "Keine Rückmeldung"

Verfasst: Mittwoch 8. Juni 2022, 11:49
von __blackjack__
@Neu111: Also letztlich stimmt die Annahme/Aussage „während die Abfragen (http-requests) im Hintergrund laufen“ nicht, denn die laufen offenbar nicht im Hintergrund.

Also sollten sie das tun, per Threading oder als Prozesse mit `threading`, `multiprocessing`, oder `concurrent.futures`: Dran denken, dass die GUI nur aus dem GUI-Thread heraus geändert werden darf. Die beiden threadsicheren Varianten dafür in wxWidgets sind `wx.CallAfter()` und `wx.PostEvent()`, je nach dem ob einem einfache Aufrufe reichen, oder ob man einen eigenen Ereignistyp für die GUI-Hauptschleife basteln will.

Re: "Keine Rückmeldung"

Verfasst: Mittwoch 8. Juni 2022, 13:13
von Neu111
noisefloor hat geschrieben: Mittwoch 8. Juni 2022, 11:07 Hallo,

wie setzt du die Requests denn ab? Nach deiner Beschreibung zu urteilen blockierst du dir selber den Mainloop der GUI.

Gruß, noisefloor
Soweit hatte ich gar nicht gedacht.

Mein abschließender Code sieht wie folgt aus:

Code: Alles auswählen

abc = wx.App()
meinObjekt = MeineKlasse(None, title='Das bin ich')
abc.MainLoop()
Innerhalb von "meinObjekt" gibt es eine Methode, die die http-Requests mittels for-Schleife nacheinander ausführt.
D.h. solange die for-Schleife läuft, wird Mainloop blockiert.
Ich stehe jetzt aber trotzdem auf den Schlauch.
Wie kann ich außerhalb von Mainloop die Methode aufrufen, und das Ergebnis dann innerhalb von Mainloop zurückspielen?

Re: "Keine Rückmeldung"

Verfasst: Mittwoch 8. Juni 2022, 13:43
von __blackjack__
@Neu111: Naja `threading` oder `multiprocessing` oder `concurrent.futures` und `wx.CallAfter()` oder `wx.PostEvent()`.

Re: "Keine Rückmeldung"

Verfasst: Mittwoch 8. Juni 2022, 13:46
von noisefloor
Hallo,
Wie kann ich außerhalb von Mainloop die Methode aufrufen, und das Ergebnis dann innerhalb von Mainloop zurückspielen?
Z.B. indem du die HTTP Request in separate Threads auslagerst, deren Ergebnis in eine Queue schreibst und die Queue periodisch im Mainloop abfragst. Geht alles mit Bordmitteln von Python und den Methoden von wx, siehe Post von __blackjack__.

Wenn du nicht weiter kommst -> zeig' am besten mal den Code, den du probier hast, dann kann man konkreter Helfen / Tipps geben.

Gruß, noisefloor

Re: "Keine Rückmeldung"

Verfasst: Mittwoch 8. Juni 2022, 13:53
von __blackjack__
@noisefloor: Queue und periodisch Abfragen braucht man bei `wx` nicht. Die beiden Funktionen die ich genannt habe sind threadsicher und bei `wx.PostEvent()` würde man einfach die Ereignis-Queue von `wx` mitbenutzen und kann da Listener für das eigene Ereignis registrieren. Ist aber eventuell auch schon zu kompliziert gedacht wenn man mit einem Aufruf auskommen kann, den man mit `wx.CallAfter()` macht.