@ChefDeus: Eingerückt wird in Python mit vier Leerzeichen pro Ebene.
Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben. Und bei GUIs braucht man dann mindestens Closures, zum Beispiel mittels `functools.partial(), für jede nicht-triviale GUI aber objektorientierte Programmierung (OOP). Also eigene Klassen.
``async`` nützt hier nichts, denn das läuft ja nicht parallel. Der `run_until_complete()`-Aufruf blockiert bis alles was von dort ausgehend ausgeführt wird abgearbeitet ist. Da ist also nichts gewonnen.
Man kann den Zwischenschritt über die `after()`-Methode realisieren.
Die ``while``-Schleife ist eine unnötig kompliziert geschriebene ``for``-Schleife.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter as tk
from functools import partial
def do_short_work(button):
for count in range(10_001):
print(count)
button["text"] = "fertig"
def start_short_work(button):
button["text"] = "gedrückt..."
button.after(10, do_short_work, button)
def main():
window = tk.Tk()
window.title("test")
button = tk.Button(window, text="test button")
button["command"] = partial(start_short_work, button)
button.pack()
window.mainloop()
if __name__ == "__main__":
main()
Falls `do_short_work()` nicht tatsächlich das macht was der Name suggeriert, also nur kurz etwas tut und damit nicht die GUI blockiert, wird man das anders lösen müssen. Entweder in dem man die Arbeit auf kleine Häppchen aufteilt die auch mit `after()` ausgeführt werden, oder man muss für parallele Ausführung sorgen, beispielsweise mittels `threading` und dann mit `after()` und einer `Queue` zwischen GUI und Thread kommunizieren.