Python闹钟项目导入datetime后报hour未定义NameError如何解决?
问题原因
该NameError和datetime模块导入无关,错误触发的核心原因是:代码在actual_time函数中直接调用了hour、min、second三个变量,但这三个变量从未在全局/函数局部作用域中被定义。你虽然导入了tkinter库,但没有创建对应的时间输入控件实例,三个变量不存在,调用自然报错。
另外你的原始代码还存在两处隐性逻辑问题:
- 使用
min作为变量名,和Python内置函数min()重名,容易引发后续不可预知的错误 alarm函数中播放音效和跳出循环的逻辑没有放到时间匹配的判断分支下,会导致程序运行1秒后就直接播放音效并退出,完全不会等待闹钟时间点。
解决方案
你需要补全tkinter的界面初始化逻辑,创建时、分、秒对应的输入控件并赋值给对应变量,同时修正逻辑错误,修改后可运行的完整代码如下:
import tkinter import datetime import time import winsound def alarm(set_alarm_timer): while True: time.sleep(1) current_time = datetime.datetime.now() now = current_time.strftime("%H:%M:%S") date = current_time.strftime("%d/%m/%y") print("The Set Date is: ", date) print(now) if now == set_alarm_timer: print("Time to Wake up") winsound.PlaySound("sound.wav", winsound.SND_ASYNC) break def actual_time(): set_alarm_timer = f"{hour.get()}:{minute.get()}:{second.get()}" alarm(set_alarm_timer) # 补全tkinter界面初始化逻辑 root = tkinter.Tk() root.title("闹钟") root.geometry("400x200") # 创建提示标签 tkinter.Label(root, text="请输入闹钟时间 格式为 时:分:秒", font=("Helvetica",14)).place(x=60,y=20) tkinter.Label(root, text="时", font=("Helvetica",12)).place(x=80,y=70) tkinter.Label(root, text="分", font=("Helvetica",12)).place(x=180,y=70) tkinter.Label(root, text="秒", font=("Helvetica",12)).place(x=280,y=70) # 创建时间输入框,给三个变量赋值 hour = tkinter.Entry(root, width=5, font=("Helvetica",14)) hour.place(x=50, y=100) minute = tkinter.Entry(root, width=5, font=("Helvetica",14)) minute.place(x=150, y=100) second = tkinter.Entry(root, width=5, font=("Helvetica",14)) second.place(x=250, y=100) # 创建设置闹钟按钮 tkinter.Button(root, text="设置闹钟", command=actual_time, width=10, font=("Helvetica",12)).place(x=150, y=140) root.mainloop()
运行代码后在输入框中填入对应时间(时填24小时制数值,比如下午2点填14),点击设置闹钟按钮即可正常运行。
内容的提问来源于stack exchange,提问作者EveryDayDev
相关产品推荐
相关产品推荐

