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

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()

修复说明

  1. 替换原alarm函数为check_alarm,用clock.after()实现每秒递归检查,避免阻塞主循环。
  2. 用zfill(2)对用户输入补零,保证时间格式和strftime返回值一致。
  3. 移除了原代码中错误的while True和break逻辑,让闹钟能持续检查时间直到匹配。

内容的提问来源于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.17 14:01:04