用python編寫一個(gè)鬧鐘小程序

今天看到了一個(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ì)彈出提示框。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容