You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加Alarm选项卡时间显示后,Python时钟程序几秒后无响应

问题根源

你的程序运行几秒后无响应,核心原因出在alarm_realtime函数里:每次执行这个函数时,你给三个Label分别调用了after(500, alarm_realtime),这意味着每过500毫秒就会新增3个alarm_realtime的调用任务。第一次执行后有3个任务,第二次这3个任务会生成9个,第三次27个……指数级增长的任务会瞬间耗尽运行资源,直接导致程序卡死。

修复方案

只需要在alarm_realtime函数末尾调用一次after即可——函数本身已经更新了所有三个Label的内容,一次定时就足够让它每隔500毫秒执行一次,完全不需要给每个Label都加定时任务。

修改后的完整代码:

from tkinter import *
from tkinter import ttk
from time import strftime

clock = Tk()
clock.title("WhatAClock")
clock.geometry("300x400")

notebook = ttk.Notebook()
tab1_timedate = Frame(notebook)
tab2_alarm = Frame(notebook)
tab3_timer = Frame(notebook)

notebook.add(tab1_timedate, text="Time and Date")
notebook.add(tab2_alarm, text="Alarm")
notebook.add(tab3_timer, text="Timer")
notebook.pack(expand=TRUE, fill="both")

def timedate_realtime():
    time_str = strftime('%H:%M:%S')
    l1_timedate.config(text= time_str)
    l1_timedate.after(500, timedate_realtime)
 
def alarm_realtime():
    H_str = strftime("%H")
    M_str = strftime("%M")
    S_str = strftime("%S")
    l1_H.config(text= H_str)
    l2_M.config(text= M_str)
    l3_S.config(text= S_str)
    # 只保留一次after调用,避免任务爆炸
    l1_H.after(500, alarm_realtime)
    
l1_timedate = Label(tab1_timedate)
l1_timedate.place(x=100, y=45)
l1_H = Label(tab2_alarm)
l2_M = Label(tab2_alarm)
l3_S = Label(tab2_alarm)
l1_H.grid(column= 1, row= 1)
l2_M.grid(column= 3, row= 1)
l3_S.grid(column= 5, row= 1)

timedate_realtime()
alarm_realtime()                                            
clock.mainloop()

额外说明:Tkinter的after是属于主窗口的定时任务,和具体调用的Widget无关,你也可以把最后一行的l1_H.after换成clock.after,效果完全一致。

内容的提问来源于stack exchange,提问作者Luca della Sciucca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:55:20