最近笔者在写一个窗体程序时,希望能每隔1秒,周期性的定时刷新文本框中的内容,但最后发现很难实现
出现各种各样的问题,最后通过查询大量的资料,才找到原因和解决方法
为了阐述清楚这个现象,笔者先用一段简单的代码进行说明,如下一段tkinter-窗体程序代码:
from tkinter import * import time root = Tk() root.title("Author:QQ-5201351") def task(): print(time.time()) while True: task() time.sleep(1) root.mainloop()
从代码上看,笔者是希望一个窗体,然后能定时,周期性的执行task函数中代码,但实际运行时,确实能每一秒输出当前的时间
但是整个窗体却不显示出来,那么就说明一点,程序由上而下执行,始终为未曾到root.mainloop()这一条,所以才没有显示出窗体
那么要不将while True那一段代码放到root.mainloop() 这一条语句的后面?试试
from tkinter import * import time root = Tk() root.title("Author:QQ-5201351") def task(): print(time.time()) root.mainloop() while True: task() time.sleep(1)
这时又出现了一个现象,窗体是显示了,但是就是不会执行到root.mainloop() 后面的内容,除非将窗体关了
其实也好理解,对于python tkinter编程,来说,mainloop()就进入到事件(消息)循环。等待检测到事件,然后刷新组件
其实其他gui编程也有类似的机制,那么如何解决这个问题呢、笔者将自己找到的方法记录如下:
from tkinter import * import time root = Tk() root.title("Author:QQ-5201351") def task(): print(time.time()) root.after(1000, task) root.after(1000, task) root.mainloop()
这样运行后,窗体会一直保持着,而且每1秒都能执行一下task函数中的代码,这两行代码,笔者说明一下作用:
1、主体的root.after(1000, task) 代表窗体运行后,1000毫秒后,执行task函数,但是只会执行一次~
2、task()函数体中的root.after(1000, task),也就是这个函数执行完了,每隔1秒再执行,循环执行~
因此这两条是核心的两条代码,缺一不可~
尊重别人的劳动成果 转载请务必注明出处:https://www.cnblogs.com/5201351/p/16758714.html
标签:task,tkinter,某段,mainloop,gui,窗体,time,root From: https://www.cnblogs.com/5201351/p/16758714.html