Seite 1 von 1

Schleife im Hintergrund bei Tkinter GUI

Verfasst: Freitag 17. Januar 2025, 20:56
von rodiboki
Hallo,

in einem Forum fand ich das Beispiel:

Code: Alles auswählen

from tkinter import *

def looping_function():
   
    print('Hallo')
    win.after(1000, looping_function) 

win = Tk()
looping_function()
win.mainloop()
Soweit läuft das...

Aber wie wird es gemacht wenn, wenn der untere Teil in einem def main(): ist ?

Code: Alles auswählen

from tkinter import *

def looping_function(winloop):

    print('Hallo')
    winloop.after(1000, looping_function(winloop)) 

def main():
    win = Tk()
    looping_function(win)
    win.mainloop()

if __name__ == "__main__":
    main()

ok, es ruft sich schnell rekursiv auf, was zum Abbruch führt.
Irgendwann ist die Rekursionstiefe halt erreicht, klar.
Wie bekomme ich das lauffähig hin, wie im oberen Codeschnipsel ?

Gruß
Mathias

Re: Schleife im Hintergrund bei Tkinter GUI

Verfasst: Freitag 17. Januar 2025, 21:37
von sparrow
Ist dir klar, was der grundlegende Unterschied ist?
Das erste Beispiel ruft die Funtkion nicht auf sindern übergibt die Funktion an sich als Parameter an "after".
Dein zweites Beispiel übergibt statt der Funktion None an after, weil das der Rückgabewerte der Funktion ist. (Bzw. würde das übergeben, wenn er nicht in der Rekursion stecken bleiben würde und so nie das Ende der Funktion erreicht.

Such mal nach "functools.partial". Das wurde hier sehr häufig diskutiert.

Re: Schleife im Hintergrund bei Tkinter GUI

Verfasst: Freitag 17. Januar 2025, 22:20
von __blackjack__
Wobei man hier statt `partial()` auch zusätzliche Argumente an `after()` übergeben kann, die Tk dann beim Aufruf an die Rückruffunktion übergibt.

Re: Schleife im Hintergrund bei Tkinter GUI

Verfasst: Freitag 17. Januar 2025, 22:28
von rodiboki
Hallo,

ich habe das Script abgeändert, wie beim Script der ComboBox (hatte hier im anderen Beitrag auch gefragt)

Jetzt bekomme ich zwar beim starten keine Fehlermeldung, aber es wird nicht aufgerufen.
Wäre gut, wenn bitte jemand das Script abändern könnte, damit ich weiß wie es geht...

Ich habe in anderen Sprachen schon viel programmiert und mit Python bin ich noch nicht lange dabei.

Gruß
Mathias

Re: Schleife im Hintergrund bei Tkinter GUI

Verfasst: Freitag 17. Januar 2025, 23:01
von rodiboki
Hallo
__blackjack__ hat geschrieben: Freitag 17. Januar 2025, 22:20 Wobei man hier statt `partial()` auch zusätzliche Argumente an `after()` übergeben kann, die Tk dann beim Aufruf an die Rückruffunktion übergibt.
ja danke... , jetzt habe ich das. Übergabe mit .after war falsch. Manchmal braucht man nur einen kleinen Tip :D

Code: Alles auswählen

from tkinter import *

def looping_function(winloop):

    print('Hallo')
    winloop.after(1000, looping_function, winloop )

def main():
    win = Tk()
    looping_function(win)
    win.mainloop()

if __name__ == "__main__":
    main()
Jetzt läuft das auch.

Gruß
Mathias