如何解决while循环和after之后重复调用函数之间的区别
两者之间有什么区别
def after_func():
while True:
now_time.configure(text=datetime.datetime.now().strftime('%H: %M: %S'))
time.sleep(1)
root = Tk()
now_time = Label(text=datetime.datetime.now().strftime('%H: %M: %S'))
now_time.pack()
root.after(10,after_func)
root.mainloop()
和
def after_func():
now_time.configure(text=datetime.datetime.now().strftime('%H: %M: %S'))
root.after(1000,after_func)
root = Tk()
now_time = Label(text=datetime.datetime.now().strftime('%H: %M: %S'))
now_time.pack()
root.after(10,after_func)
root.mainloop()
为什么第一个消息没有响应,而第二个消息却导致时钟每秒更新一次?我认为这两个代码应产生相同的结果。
解决方法
关键的区别在于,使用root.after
的代码允许事件循环(mainloop
)处理每次迭代之间的事件。 while
循环没有。 Tkinter应用程序几乎依赖于事件循环,包括操作系统或应用程序本身在检测到应显示内容的更改时重绘窗口的请求。
通过在循环中调用while
,您可以通过root.update
循环几乎获得相同的结果,但是不建议这样做。另外,sleep
的使用恰如其名,即:整个程序进入睡眠状态一秒钟。在那一秒钟内,您的应用将完全不响应。
从技术上讲,带有after
的版本不是递归的。它所做的只是将自己放在队列中,以备后用。调用堆栈不会变大。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。