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)