Tkinter闹钟项目按钮功能异常问题求助
你的闹钟代码失效的原因及修复方案
核心问题分析
- alarm函数循环逻辑错误:你写的
while True循环仅执行一次时间检查就立刻break退出,根本不会持续等待时间匹配,自然无法触发闹钟。 - 阻塞Tkinter主循环:如果强行去掉
break,while True会无限占用主线程,导致Tkinter界面完全卡死——Tkinter是单线程模型,主循环不能被长时间阻塞。 - 时间格式不匹配:用户输入的时分秒可能是单数字(比如
9),但strftime返回的是两位格式化字符串(比如09),直接拼接后会出现9:5:3和09:05:03这种无法匹配的情况。
修复后的代码
改用Tkinter的after方法实现定时检查,既不阻塞主循环,又能持续验证时间:
from tkinter import * from tkinter import ttk from time import strftime import winsound 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 realtime(): time_str = strftime("%H:%M:%S") l1_time_timedate.config(text= time_str) l1_time_alarm.config(text= time_str) clock.after(1000, realtime) def check_alarm(alarm_set): time_str_alarm = strftime("%H:%M:%S") if time_str_alarm == alarm_set : winsound.playsound("sound.wav", winsound.SND_ASYNC) else: # 每隔1秒递归检查一次,直到时间匹配 clock.after(1000, check_alarm, alarm_set) def set_alarm(): # 对输入补零,确保格式为两位数字 h = user_h.get().zfill(2) m = user_m.get().zfill(2) s = user_s.get().zfill(2) alarm_set = f"{h}:{m}:{s}" check_alarm(alarm_set) l1_time_timedate = Label(tab1_timedate) l1_time_alarm = Label(tab2_alarm) l1_time_timedate.place(x=20, y=30) l1_time_alarm.place(x=20, y=30) user_h = StringVar() user_m = StringVar() user_s = StringVar() entry_h = Entry(tab2_alarm, textvariable= user_h, width=3) entry_m = Entry(tab2_alarm, textvariable= user_m, width=3) entry_s = Entry(tab2_alarm, textvariable= user_s, width=3) entry_h.place(x=100, y=30) entry_m.place(x=130, y=30) entry_s.place(x=160, y=30) button_alarm = Button(tab2_alarm, command= set_alarm, text= "SET ALARM") button_alarm.place(x=100, y=70) realtime() clock.mainloop()
修复说明
- 替换原
alarm函数为check_alarm,用clock.after()实现每秒递归检查,避免阻塞主循环。 - 用
zfill(2)对用户输入补零,保证时间格式和strftime返回值一致。 - 移除了原代码中错误的
while True和break逻辑,让闹钟能持续检查时间直到匹配。
内容的提问来源于stack exchange,提问作者Luca della Sciucca
相关产品推荐
相关产品推荐

