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!
"Keine Rückmeldung"
- noisefloor
- User
- Beiträge: 3858
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
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
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
- __blackjack__
- User
- Beiträge: 13122
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@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.
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Soweit hatte ich gar nicht gedacht.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
Mein abschließender Code sieht wie folgt aus:
Code: Alles auswählen
abc = wx.App()
meinObjekt = MeineKlasse(None, title='Das bin ich')
abc.MainLoop()
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?
- __blackjack__
- User
- Beiträge: 13122
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Neu111: Naja `threading` oder `multiprocessing` oder `concurrent.futures` und `wx.CallAfter()` oder `wx.PostEvent()`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
- noisefloor
- User
- Beiträge: 3858
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Wenn du nicht weiter kommst -> zeig' am besten mal den Code, den du probier hast, dann kann man konkreter Helfen / Tipps geben.
Gruß, noisefloor
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__.Wie kann ich außerhalb von Mainloop die Methode aufrufen, und das Ergebnis dann innerhalb von Mainloop zurückspielen?
Wenn du nicht weiter kommst -> zeig' am besten mal den Code, den du probier hast, dann kann man konkreter Helfen / Tipps geben.
Gruß, noisefloor
- __blackjack__
- User
- Beiträge: 13122
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman