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.