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

Tkinter闹钟项目触发回调异常,闹钟无法设置求助

解决Tkinter闹钟项目的回调异常与闹钟失效问题

核心错误分析

你的代码触发Exception in Tkinter callback异常和闹钟失效,主要是以下几个问题:

  • 缺失ttk模块导入:使用ttk.Notebook但未导入tkinter.ttk,会直接抛出NameError。
  • after方法调用错误:clock.after(1000, alarm_set)把字符串alarm_set当作函数传入,而非调用alarm函数并传递参数,这是回调异常的直接原因。
  • 补0格式化逻辑错误:原注释中的补0代码用了双引号嵌套语法错误,且直接对字符串使用:02格式化会报错,需要先转为整数。
  • 无输入验证:用户输入非数字时会触发ValueError。

修复步骤

  1. 导入ttk模块:在开头添加from tkinter import ttk
  2. 修正alarm函数的after调用:将clock.after(1000, alarm_set)改为clock.after(1000, alarm, alarm_set),确保正确传递回调函数和参数。
  3. 修复补0格式化逻辑:先将输入的字符串转为整数,再进行补0格式化,同时添加异常处理。
  4. 修正布尔值大小写:将expand=TRUE改为expand=True(Python布尔值规范写法)。

修复后完整代码

from tkinter import *
from tkinter import ttk  # 新增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")  # 修正TRUE为True

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 alarm(alarm_set):
    time_str_alarm = strftime("%H:%M:%S")
    if time_str_alarm == alarm_set:
            winsound.PlaySound("sound.wav",winsound.SND_ASYNC)
    else:
        clock.after(1000, alarm, alarm_set)  # 修正after调用,传递函数和参数

def set_alarm():
    try:
        # 转整数后补0格式化,确保时间格式与strftime输出一致
        h = f"{int(user_h.get()):02}"
        m = f"{int(user_m.get()):02}"
        s = f"{int(user_s.get()):02}"
        alarm_set = f"{h}:{m}:{s}"
        alarm(alarm_set)
    except ValueError:
        # 处理非数字输入的情况
        from tkinter import messagebox
        messagebox.showerror("输入错误", "请输入有效的数字时间")
    
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)
entry_m = Entry(tab2_alarm, textvariable= user_m)
entry_s = Entry(tab2_alarm, textvariable= user_s)
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()

额外说明

  • 补0操作本身和回调异常无关,但修复后能确保输入的时间格式(如9:5:3)转为09:05:03,与strftime输出的格式一致,保证时间匹配逻辑正常。
  • 新增的输入验证可以避免用户输入非数字时触发崩溃,提升程序稳定性。

内容的提问来源于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:25:25