Schleife im Hintergrund bei Tkinter GUI

Fragen zu Tkinter.
Antworten
rodiboki
User
Beiträge: 8
Registriert: Freitag 17. Mai 2024, 12:58

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
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei man hier statt `partial()` auch zusätzliche Argumente an `after()` übergeben kann, die Tk dann beim Aufruf an die Rückruffunktion übergibt.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
rodiboki
User
Beiträge: 8
Registriert: Freitag 17. Mai 2024, 12:58

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
rodiboki
User
Beiträge: 8
Registriert: Freitag 17. Mai 2024, 12:58

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
Antworten