Tkinter después de que el método se ejecute inmediatamente

El método ‘after’ de TKinter se ejecuta inmediatamente, luego se detiene por 3 segundos después de la ejecución. Si también uso el método ‘después’ en mi función CheckStatus, pasa a un ciclo rápido y nunca llega al mainloop ().

¿Qué estoy haciendo mal? la documentación dice que la función se llamaría después del tiempo de pausa, pero en realidad está sucediendo antes. Quiero llamar a CheckStatus cada segundo para una entrada de hardware en Raspberry Pi, así como para que el mainloop normal responda a los eventos del usuario.

from tkinter import * def DoClick(entries): global ButCount ButCount += 1 print("ButCount", ButCount, "TimeCount", TimeCount) def newform(root): L1 = Label(root, text = "test of 'after' method which seems to call before time") L1.pack() def CheckStatus(): global TimeCount TimeCount += 1 print("In CheckStatus. ButCount", ButCount, "TimeCount", TimeCount) # root.after(3000, DoTime()) root = Tk() ButCount = 0 TimeCount = 0 if __name__ == '__main__': FormData = newform(root) root.bind('', (lambda event, e=FormData: fetch(e))) b1 = Button(root, text='Click me', command=(lambda e=FormData: DoClick(e))) b1.pack() print("Before root.after(") root.after(3000, CheckStatus()) print("Done root.after(") root.mainloop() 

Estás utilizando después incorrectamente. Considera esta línea de código:

 root.after(3000, CheckStatus()) 

Es exactamente lo mismo que esto:

 result = CheckStatus() root.after(3000, result) 

¿Ves el problema? después requiere una llamada – una referencia a la función.

La solución es pasar una referencia a la función:

 root.after(3000, CheckStatus) 

Tienes un error en tu código, con:

 root.after(3000, CheckStatus()) 

que tiene que ser:

 root.after(3000, CheckStatus) # ^^ parens removed. 

Pasar CheckStatus() realidad llama a la función en lugar de pasar su referencia.

También suena como que quieres llamar a CheckStatus una y otra vez. Puede hacerlo con una llamada recursiva en CheckStatus. Ya tienes:

 # root.after(3000, DoTime()) 

en su código, en CheckStatus() . Quizás quieras cambiar eso a:

 root.after(3000, CheckStatus) 

para obtener su comprobación asincrónica.

Además, dependiendo de lo que realmente estés intentando hacer, es posible que desees que la llamada “recursiva” sea condicional.