今天看到了一個(gè)鬧鐘的視頻,于是想到了不如自己也編寫一個(gè)。讓我們先來(lái)理一下思路,界面用tkinter編輯,主要是其他的GUI也沒(méi)用過(guò),datetime獲取本地時(shí)間。。。。。。
1.好的,思路理完了,讓我們來(lái)敲代碼吧。先創(chuàng)建一個(gè)AlarmClock類繼承自Tk,控件什么的隨便放放,也不用追求什么美觀了。
class AlarmClock(Tk):
def __init__(self):
super().__init__()
self.title('我的鬧鐘')
self.minsize(width=300, height=300)
# 設(shè)置控件
Label(self, text='現(xiàn)在時(shí)間:', font=('Arial', 15)).place(x=10, y=10)
self.now_time = str(datetime.now()).split('.')[0] #獲取本地時(shí)間
self.var_nowtime = StringVar(value=self.now_time)
Label(self, textvariable=self.var_nowtime, font=('Arial', 15), bg='#D6EAF8').place(x=50, y=50)
# 鬧鐘的時(shí)間設(shè)置部分用了三個(gè)entry控件輸入時(shí)分秒
Label(self, text='設(shè)置鬧鐘:', font=('Arial', 15)).place(x=10, y=90)
self.var_hour = StringVar(value='00')
self.var_min = StringVar(value='00')
self.var_sec = StringVar(value='00')
self.entry_hour = Entry(self, textvariable=self.var_hour, font=('Arial', 15), bg='#D6EAF8', width=3,
justify='center')
self.entry_hour.place(x=60, y=130)
Label(self, text=':', font=('Arial', 15)).place(x=105, y=130)
self.entry_min = Entry(self, textvariable=self.var_min, font=('Arial', 15), bg='#D6EAF8', width=3,
justify='center')
self.entry_min.place(x=120, y=130)
Label(self, text=':', font=('Arial', 15)).place(x=165, y=130)
self.entry_sec = Entry(self, textvariable=self.var_sec, font=('Arial', 15), bg='#D6EAF8', width=3,
justify='center')
self.entry_sec.place(x=180, y=130)
# 因?yàn)橹荒茉O(shè)定一個(gè)鬧鐘,所以再次設(shè)定的話要重置
self.btn_replace = Button(self, text='重置', font=('Arial', 12), width=5, command=self.replace)
self.btn_replace.place(x=70, y=180)
# 開(kāi)關(guān)按鈕控制鬧鐘的開(kāi)和關(guān),初始是OFF狀態(tài),點(diǎn)擊變成ON狀態(tài)啟動(dòng)鬧鐘
self.btn_begin = Button(self, text='OFF', font=('Arial', 12), width=5, command=self.beginning)
self.btn_begin.place(x=150, y=180)
下面是界面圖

4)72V({PY5V_L7B9~BRWBVO.png
2.接下來(lái)就是編輯兩個(gè)按鈕的功能函數(shù)了
開(kāi)關(guān)按鈕
def beginning(self):
flag = self.btn_begin['text'] # 定義一個(gè)flag來(lái)表示鬧鐘的狀態(tài)
# 如果是打開(kāi)狀態(tài)就什么也不做
if flag == 'ON':
return
# 如果是關(guān)閉狀態(tài),就把text變?yōu)镺N,三個(gè)輸入框變?yōu)椴豢删庉? else:
self.btn_begin['text'] = 'ON'
self.entry_hour['state'] = DISABLED
self.entry_min['state'] = DISABLED
self.entry_sec['state'] = DISABLED
# 獲取三個(gè)輸入框內(nèi)的時(shí)間
set_time = '%s:%s:%s' % (self.entry_hour.get(), self.entry_min.get(), self.entry_sec.get())
list_time = []
for i, j in zip(set_time.split(':'), self.now_time.split(' ')[-1].split(':')):
# 計(jì)算離鬧鐘啟動(dòng)還有多少時(shí)間
list_time.append(abs(int(i) - int(j)))
messagebox.showinfo(title='設(shè)置成功', message='距離啟動(dòng)還有%d小時(shí)%d分%d秒' % tuple(list_time))
重置按鈕
def replace(self):
# 重置按鈕把三個(gè)輸入框內(nèi)容變?yōu)?0,同時(shí)變?yōu)榭删庉嫚顟B(tài),開(kāi)關(guān)按鈕變?yōu)镺FF
self.var_hour.set('00')
self.var_min.set('00')
self.var_sec.set('00')
self.btn_begin['text'] = 'OFF'
self.entry_hour['state'] = NORMAL
self.entry_min['state'] = NORMAL
self.entry_sec['state'] = NORMAL
messagebox.showinfo(title='重置成功', message='重置成功')
3.現(xiàn)在Label顯示的本地時(shí)間是靜止的,要想讓它動(dòng)起來(lái)則需要在死循環(huán)內(nèi)不斷使用update()方法,所以我們?cè)偌右粋€(gè)死循環(huán)的方法timer
def timer(self):
player = ctypes.windll.kernel32 # 這個(gè)模塊我也不是太清楚,這里是用來(lái)產(chǎn)生蜂鳴的
while True:
self.now_time = str(datetime.now()).split('.')[0]
self.var_nowtime.set(self.now_time)
self.update()
set_time = '%s:%s:%s' % (self.entry_hour.get(), self.entry_min.get(), self.entry_sec.get())
if self.btn_begin['text'] == 'ON':
# 設(shè)定時(shí)間和本地時(shí)間一致,鬧鐘就響1.5秒
if set_time == self.now_time.split(' ')[-1]:
for i in range(3):
# 人耳能聽(tīng)到的頻率是20~20000HZ,這里設(shè)定2000HZ,500ms
player.Beep(2000, 500)
time.sleep(1) # 1秒鐘更新一次
到這里這個(gè)簡(jiǎn)單的小程序就完成了,是不是很簡(jiǎn)單呢。代碼其實(shí)還有很多可以擴(kuò)展的地方,比如可以設(shè)定多個(gè)鬧鐘(就像手機(jī)上一樣)。還可以定時(shí)關(guān)機(jī)什么的,看你自由發(fā)揮了。其實(shí)代碼很簡(jiǎn)單,難的是把界面編輯的好看美觀。如果有什么疑問(wèn)或指教,歡迎交流。

image.png
這是最終的效果圖,在設(shè)定完時(shí)間后點(diǎn)擊開(kāi)關(guān)按鈕會(huì)彈出提示框。