Seite 1 von 1

Warten bis eine andere Funktion zu ende ist?

Verfasst: Mittwoch 15. Juli 2020, 20:26
von CODER123
Hi, wie kann man in Python 3.8.0 warten, bis eine funktion zu ende ist? Da ich Tkiter Canvas verwende, kann ich nicht
while True:
if Funktionzuende == True:
break
verwenden. Die funktion ist eine per Tastendruck ausgelöste Funktion.
Danke

Re: Warten bis eine andere Funktion zu ende ist?

Verfasst: Mittwoch 15. Juli 2020, 21:12
von sparrow
Da musst du schon etwas genauer werden. Normalerweise werden Befehle sequentiell, also nacheinander, abgearbeitet.
Was auch immer aufruft worauf du wartest, muss halt anschließend aufrufen, was danach kommen soll.

Re: Warten bis eine andere Funktion zu ende ist?

Verfasst: Mittwoch 15. Juli 2020, 23:43
von snafu
Aber nicht in einer GUI, es wurde ja TKinter genannt.

Man muss mit den Mitteln des Frameworks aus der Funktion heraus den nächsten Schritt anstoßen (siehe sparrow). Tkinter hat die Funktion after(), die man mit einer Wartezeit von 0 und der nächsten Funktion als Callback ganz am Ende der betreffenden Funktion aufruft, um das Problem zu lösen. Einen direkten Aufruf unter Weglassen von after() sollte man unterlassen, damit der Mainloop zwischendurch wieder die Kontrolle hat (und um Rekursion zu vermeiden).

Re: Warten bis eine andere Funktion zu ende ist?

Verfasst: Donnerstag 16. Juli 2020, 07:55
von __blackjack__
@snafu: Die Antwort verstehe ich nicht so ganz, denn auch bei Tkinter wartet alles bis eine durch einen Buttondruck ausgelöste Funktion abgearbeitet ist. Da stellt sich die Frage „wie prüfe ich wann die zuende ist“ nicht wirklich, denn es läuft ja nirgends Code parallel, der diese Frage sinnvoll stellen können würde. Ich habe die Problemstellung noch nicht wirklich verstanden.

Re: Warten bis eine andere Funktion zu ende ist?

Verfasst: Donnerstag 16. Juli 2020, 08:58
von snafu
Klar sollten wir die Antwort des TE abwarten.

Meine Interpretation war halt, dass eine Funktion durch einen Klick oder ähnliches ausgelöst wird. Diese läuft etwas länger, wobei die GUI natürlich sofort zurückkehrt. Die Frage habe ich jetzt so verstanden, dass nach dieser längeren Funktion eine andere Aktion passieren soll und wie man das Funktionsende halt mitbekommt. Daher mein Hinweis auf after(). Mag aber auch sein, dass ich komplett auf dem falschen Dampfer bin. Wird sich ja zeigen...

Re: Warten bis eine andere Funktion zu ende ist?

Verfasst: Donnerstag 16. Juli 2020, 09:26
von CODER123
Mal ganz detailiert erklärt:
Ich habe mehrere Funktionen, die eine Figur über die Canvas bewegen, wenn der User eine der Pfeiltasten drückt. Wenn er mit der Leertaste bestätigt, wird die Position ausgewertet und je nachdem wo sich die Figur befindet passiert etwas oder eben nicht. Die Hauptschleife "verwaltet" alle Aktionen, die nach dem Verschieben der Figur
geschehen sollen. Was muss ich da hinnschreiben, damit die Hauptschleife erst fortfährt, wenn die funktion nach der Leertaste ausgeführt wurde? Weil die Auswertungsfunktion auch abbrechen kann, wenn die Figur auserhalb der möglichen Felder abgestellt wird, kann ich nicht einfach auf die Leertaste warten. Kann mir vieleicht noch jemand ein Beispiel für die after()-Mehtode machen, bitte?

Re: Warten bis eine andere Funktion zu ende ist?

Verfasst: Donnerstag 16. Juli 2020, 09:47
von __blackjack__
@CODER123: Wie verwaltet ”die Hauptschleife” das denn? Die kann es doch gar nicht geben, denn *die* Hauptschleife ist die `mainloop()`-Funktion von Tk. *Du* kannst da ja gar keine ``while irgendwas:``-Schleife *parallel* dazu laufen haben. Also was machst/versuchst Du da konkret?

Für `after()` gibt es viele Beispiele hier im Forum.

Eine ``while``-Schleife die alles verwaltet, geht in GUI-Programmen nicht. GUI-Programme funktionieren an der Stelle komplett anders als die üblichen Konsolenprogramme bei denen der Programmierer den Programmablauf linear ausprogrammiert. Und man braucht deshalb auch für jedes nicht-triviale GUI-Programm objektorientierte Programmierung (OOP), weil man sich Zustand über Aufrufe hinweg merken muss und den nicht mehr rein funktional als Argumente und Rückgabewerte austauschen kann.

Re: Warten bis eine andere Funktion zu ende ist?

Verfasst: Donnerstag 16. Juli 2020, 09:58
von CODER123
ich versuche es, indem ich eine Schleife, die ich haptschleife nenne(vielecht ein verwirrdender name, ab jetzt nenne ich sie Verwaltungsschleife) habe, die die Funktionen aufruft. Diese erlaubt dann das bewegen der figur(das funktioniert). Wenn diese nun platziert ist(leertaste) und die auswertung fertig ist, soll die Verwaltungsschleife weitergehen(Hier liegt das problem)denn dann werden die Punkte ausgewertet und sobald die Punkte ausgewertet sind, werden die Felder vertauscht und dann begint die Verwlatungsschleife wieder von vorne. Die Verwaltungsschleife ist erst dann zuende, wenn 100 punkte gemacht wurden.

Re: Warten bis eine andere Funktion zu ende ist?

Verfasst: Donnerstag 16. Juli 2020, 10:04
von sparrow
Zeig doch einfach entsprechenden Code statt ihn zu beschreiben.

Re: Warten bis eine andere Funktion zu ende ist?

Verfasst: Donnerstag 16. Juli 2020, 10:15
von __blackjack__
@CODER123: Wie kann denn Deine Schleife, egal wie man die nennt, parallel zur `mainloop()` von Tk laufen? Normaler Ablauf bei GUI-Programmen ist doch das man die GUI-Elemente erstellt und Anordnet und Rückruffunktionen/-methoden für bestimmte Ereignisse registriert und dann die `mainloop()` aufruft. Und dann läuft *die*. Und die ruft dann bei Eintritt der Ereignisse, beispielsweise der Benutzer hat die Leertaste betätigt als der Canvas den Eingabefokus hatte, die entsprechende, nur kurz laufene Funktione oder Methode auf, die auf dieses Ereignis reagiert.

Und wenn nach dem 100. mal dass das passiert ist, irgendwas angestossen werden soll, dann muss das irgendwie im Zustandsautomaten, der ja letztlich hinter der Programmlogik stehen müsste, geprüft werden und entsprechend muss was passieren. Was auch immer dann in Deinem Programm passieren soll. Da parallel was laufen zu lassen, egal wie, ist eigentlich nicht nötig. Das heisst man würde sich damit unnötigerweise Nebenläufigkeit und damit unnötige Komplexität ins Programm holen.

Nach dem was Du beschreibst, sieht das halt so aus als wenn Du versuchst gegen das GUI-Rahmenwerk zu programmieren, statt mit dem GUI-Rahmenwerk. Also irgendwie einen linearen Programmablauf da rein zu quetschen statt Dich auf den ereignisbasierten Programmablauf einzulassen.