博客园  :: 首页  :: 管理

最近笔者在写一个窗体程序时,希望能每隔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