今天看到了一個(gè)鬧鐘的視頻,于是想到了不如自己也編寫一個(gè)满着。讓我們先來理一下思路谦炒,界面用tkinter編輯,主要是其他的GUI也沒用過风喇,datetime獲取本地時(shí)間宁改。。响驴。透且。。豁鲤。
1.好的秽誊,思路理完了,讓我們來敲代碼吧琳骡。先創(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)
# 開關(guān)按鈕控制鬧鐘的開和關(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.接下來就是編輯兩個(gè)按鈕的功能函數(shù)了
開關(guān)按鈕
def beginning(self):
flag = self.btn_begin['text'] # 定義一個(gè)flag來表示鬧鐘的狀態(tà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)嬉荆,開關(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)起來則需要在死循環(huán)內(nèi)不斷使用update()方法酷含,所以我們?cè)偌右粋€(gè)死循環(huán)的方法timer
def timer(self):
player = ctypes.windll.kernel32 # 這個(gè)模塊我也不是太清楚鄙早,這里是用來產(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):
# 人耳能聽到的頻率是20~20000HZ,這里設(shè)定2000HZ限番,500ms
player.Beep(2000, 500)
time.sleep(1) # 1秒鐘更新一次
到這里這個(gè)簡單的小程序就完成了舱污,是不是很簡單呢。代碼其實(shí)還有很多可以擴(kuò)展的地方弥虐,比如可以設(shè)定多個(gè)鬧鐘(就像手機(jī)上一樣)扩灯。還可以定時(shí)關(guān)機(jī)什么的,看你自由發(fā)揮了躯舔。其實(shí)代碼很簡單驴剔,難的是把界面編輯的好看美觀。如果有什么疑問或指教粥庄,歡迎交流丧失。
image.png
這是最終的效果圖,在設(shè)定完時(shí)間后點(diǎn)擊開關(guān)按鈕會(huì)彈出提示框惜互。