【问题标题】:Tkinter clock crashing with infinite loop?Tkinter 时钟因无限循环而崩溃?
【发布时间】:2014-02-23 15:48:18
【问题描述】:

我正在创建一个名为time_displayStringVar,其中包含时尚3:14:02 的字符串,以及窗口中应该(理论上)反映对所述StringVar 的更新的单个标签。但是,当我调用updateTime 来检查时间并更新它时,我在无限循环中崩溃了。我所做的其他调整没有导致无限循环,但也没有更新时钟。我做错了什么?

from tkinter import *
from tkinter import ttk
import time

root = Tk()
root.title("Clock")

def updateTime(var):
    hours = time.localtime().tm_hour
    if hours == 0:
        hours = 12
    minutes = time.localtime().tm_min
    if minutes < 10:
        minutes = '0' + str(minutes)
    else:
        minutes = str(minutes)
    seconds = time.localtime().tm_sec
    if seconds < 10:
        seconds = '0' + str(seconds)
    else:
        seconds = str(seconds)
    current_time = str(hours) + ':' + minutes + ':' + seconds
    var.set(current_time)
    root.after(500, updateTime(var))

time_display = StringVar()
updateTime(time_display)

ttk.Label(root, textvariable=time_display).grid(column=0, row=0)
root.mainloop()

【问题讨论】:

    标签: python python-3.x tkinter tk


    【解决方案1】:

    在下一行,代码直接调用updateTime;导致递归调用。

    root.after(500, updateTime(var))
    #                         ^   ^
    

    传递函数和参数而不调用它会解决你的问题。

    root.after(500, updateTime, var)
    

    您也可以使用lambda:

    root.after(500, lambda: updateTime(var))
    

    顺便说一句,使用time.strftimeupdateTime可以减少:

    def updateTime(var):
        var.set(time.strftime('%H:%M:%S'))
        root.after(500, updateTime, var)
    

    【讨论】:

    • 天哪,这太明显了。我是 tkinter 的新手,完全不熟悉 python 或编程。这么愚蠢的错误!谢谢。虽然我很惊讶它在接收 NoneType 参数时没有出错....会提供信息,然后我会立即看到错误。
    • @Aerovistae,根据after documentationNone 也是一个有效的论点。 (Nonecallback 参数的默认值)
    猜你喜欢
    • 1970-01-01
    • 2023-01-31
    • 2014-05-14
    • 2014-01-31
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多