第一个项目的闹钟


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 alarm(alarm_set):
while True:
time_str_alarm = strftime("%H:%M:%S")
if time_str_alarm == alarm_set :
winsound.playsound("sound.wav",winsound.SND_ASYNC)
break

def set_alarm():
alarm_set  = f"{user_h.get()}:{user_m.get()}:{user_s.get()}"
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)
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()

"又是一次彻底的失误,搞不明白为什么按钮不按它应该做的事,有线索吗?

有几个问题:

  • alarm_set的小时、分钟和秒不是零填充的。所以,如果小时是1,分钟是2,秒是3,那么alarm_set就是"1:2:3"。然而,time_str_alarm"01:02:03"类似,因此检查将不是您想要的。

  • 不要在alarm()内部使用while循环,因为它会阻止tkintermainloop()处理挂起的事件。在realtime()中使用类似after()

  • winsound.playsound(...)应为winsound.PlaySound(...),而不是

以下是修改后的代码:

def alarm(alarm_set):
time_str_alarm = strftime("%H:%M:%S")
if time_str_alarm == alarm_set:
# time reached, play sound
winsound.PlaySound("sound.wav",winsound.SND_ASYNC)
else:
# time not reached, keep checking
clock.after(1000, alarm, alarm_set)

def set_alarm():
# zero padded hour, minute and second
alarm_set = f"{user_h.get():02}:{user_m.get():02}:{user_s.get():02}"
alarm(alarm_set)

最新更新