• 关于tkintergui窗体中循环周期性执行某段代码的方法记录


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

  • 相关阅读:
    字体图标
    HBase Shell 常用命令
    Centos7 KVM日常运维
    Centos7 KVM安装部署
    Centos7安装Puppet自动运维
    Centos7安装ansible自动运维
    H3C巡检基本命令
    组播学习
    Centos7下使用LVM给系统硬盘扩容
    python 类中方法总结 --- 实例方法、类方法、静态方法
  • 原文地址:https://www.cnblogs.com/5201351/p/16758714.html
Copyright © 2020-2023  润新知