Mit Funktionen sofort Widgets manipulieren

Fragen zu Tkinter.
Antworten
Lutuquox
User
Beiträge: 5
Registriert: Samstag 10. Dezember 2016, 21:23

Hallo!

Ich habe folgendes Problem: Ich möchte beim Klicken auf einen Button sofort ein Label haben, das anzeigt "Anforderung in Arbeit" und erst dann die eigentliche Arbeit starten. Also habe ich mir ein Label mit textvar erstellt und zu Beginn der mit dem Button verknüpften Funktion die zusammenhängende StringVar manipuliert, und anschließend kommt der eigentliche Code. Wenn ich jetzt aber auf den Button klicke, bleibt er so lange eingedrückt, bis die Funktion terminiert und erst dann wird die Manipulation der StringVar sichtbar. Was muss ich machen, damit die Änderung der StringVar sofort im Label sichtbar ist?

EDIT: Aaaah bin nach ewigem Rumprobieren auf die .update()-Methode gestoßen, Anwendung auf das Label nach Manipulation der StringVar hat die erhoffte Wirkung gezeigt! Kann den Beitrag nicht selbst löschen, daher bleibt er wohl hier stehen :D
BlackJack

@Lutuquox: Wobei von `update()` eher abgeraten wird wenn man nicht genau weiss was man da tut. Und auch dabei bleibt ja das Problem das die GUI ”tot” ist solange die Bearbeitung läuft. Es gibt Betriebssysteme die den Benutzer in solchen Fällen dann fragen ob er die nicht mehr reagierende Anwendung schliessen möchte.

Besser wäre es die Aufgabe dann asynchron zur GUI zu erledigen. Das geht zum Beispiel mit dem `concurrent.futures`-Modul und einer `Queue` oder einem `threading.Event` zur Kommunikation zwischen den beiden Threads. Weil wichtig: Die GUI darf nur von dem Thread aus manipuliert werden, in dem die GUI-Hauptschleife läuft. Der muss dann regelmässig mit der `after()`-Methode auf Widgets abfragen ob das Ergebnis vorliegt.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Lutuquox hat geschrieben:Hallo!

Ich habe folgendes Problem: Ich möchte beim Klicken auf einen Button sofort ein Label haben, das anzeigt "Anforderung in Arbeit" und erst dann die eigentliche Arbeit starten. Also habe ich mir ein Label mit textvar erstellt und zu Beginn der mit dem Button verknüpften Funktion die zusammenhängende StringVar manipuliert, und anschließend kommt der eigentliche Code. Wenn ich jetzt aber auf den Button klicke, bleibt er so lange eingedrückt, bis die Funktion terminiert und erst dann wird die Manipulation der StringVar sichtbar. Was muss ich machen, damit die Änderung der StringVar sofort im Label sichtbar ist?
Ganz einfach: mach das Label und die eigentliche Arbeit rufst Du dann mit after auf
Antworten