最近笔者在写一个窗体程序时,希望能每隔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
作者:一名卑微的IT民工
出处:https://www.cnblogs.com/5201351
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
由于博主的水平不高,文章没有高度、深度和广度,只是凑字数,不足和错误之处在所难免,希望大家能够批评指出。
博主是利用读书、参考、引用、复制和粘贴等多种方式打造成自己的文章,请原谅博主成为一个卑微的IT民工!