用Python寫個「倒計時」軟件

先拋上公衆號二維碼再入正題
公衆號二維碼.jpg

學編程路上遇到一個問題,在電腦前坐着坐着坐久了就忘了時間了。。。
忘了喫飯。。。
忘了去廁所。。。
忘了遊戲裏收割。。。
忘了做飯時候開着火定時5分鐘。。。
忘了說好的10分鐘後出門。。。。

可能,你也有以上這困惑?so,一起用python寫個倒計時軟件吧!
孔子說把問題放在face前,就不是問題了。「文末有視頻演示」

可能你說:幹嘛不用手機上鬧鈴??
我想說:拿手機就走神、分心,而且電腦鍵盤敲數字不比手機切換APP快得多??

01-設想

想的清楚就會做得明白,這個小程序腳本我設想需要以下幾方面功能:

  • 倒計時結束需要有聲音提示—聽覺上刺激我
  • 可以看到倒計時的時間顯示—視覺上提醒我
  • 可以輸入簡單幾分鐘的—應對幾分鐘小任務
  • 也可以輸入跨天的—應對跨天的大任務(電腦不關機的話)

02-整結構和素材

首先在pycharm裏新建一個工程,然後在這個工程下新建一個py文件並找到一個提示音文件, 如下方截圖。
image.png
這個聲音素材哪裏找呢?
這需要萬能的百度,我是在這個網站找到的:點我前往
隨便找到一個讓你緊張刺激的就行咱這是定製嘛~
image.png

03-Coding

創建好上方的結構,那麼就完成90%工作內容了,剩下的就交給鍵盤打字了

用到的包

掉包俠需要用到的包如下:倒計時嘛,怎麼少得了time和datetime;os是清屏用的,pygame是播放音樂用的。

import time,os
from pygame import mixer
import datetime

解決播放音頻文件問題

用pygame模塊的音樂功能來放音樂,別的播放音樂的包也有不少,比如mutagen但pygame我不用搜索就知道怎麼用了,所以寫一個放音頻的函數

默認傳入個文件名後,設置從頭播放,滿音量播放(這個視你用的音頻文件音量大小去調節)

def playMusic(filename, loops=0, start=0.0, value=1):
    """
    :param filename: 文件名
    :param loops: 循環次數
    :param start: 從多少秒開始播放
    :param value: 設置播放的音量,音量value的範圍爲0.0到1.0
    """
    mixer.init()
    mixer.music.load(filename)
    mixer.music.play(loops=loops, start=start)
    mixer.music.set_volume(value)  # 來設置播放的音量,音量value的範圍爲0.0到1.0。

解決打印秒數問題

我的需求裏有一個是:能看到還剩多少秒就結束倒計時了,因此需要做一個打印時間的方法,這個方法如下:

默認了日期、小時、分鐘、秒都是0,這樣傳哪個參數就用哪個參數參與seconds 那行的公式計算,爲0的自然乘積還是0

timess這行指的是:如果我輸入33分鐘,我要看到33分鐘後是幾點,所以用datetime的方法給算一下。

for循環:因爲我要看到秒數一點一點減少,所以這個循環就能實現這個功能。哪個time.sleep()一定給1哈,不然你的時間感跟別人不一樣。。

def daojishi(day=0, hour=0, min=0.0, second=0):
    print(f'總時間{day}day; {hour}H; {min}min')
    seconds = int(day * 24 * 3600 + hour * 3600 + min * 60 + second)
    timess = (datetime.datetime.now() + datetime.timedelta(days=day, hours=hour, minutes=min)).strftime("%Y/%m/%d %H:%M:%S")
    print(f'目標時間:{timess}')
    for i in reversed(range(0, seconds)):
        print("\r倒計時:{}秒".format(i), end="")
        time.sleep(1)

    playMusic('BeepStop.WAV')
    time.sleep(0.2)

解決輸入時間問題

我的需求還有一句,可以在一天內算,也可以在多天跨天的算,因此有了以下這兩個方法

in one day方法裏,直接輸入倒計時分鐘數,看裏邊有個float轉換,因此想輸入4分30秒的話,直接輸入4.5即可;

如果輸入q則退出這個計時;

爲了防止誤觸、或者輸入了不該輸入的,封裝個try/except;

in some day方法裏,可以輸入天數、小時數,分鐘數。比如1天1小時1分鐘,比如8小時後那就輸入0天8小時0分鐘。。。

# 一天的
def in_one_day():
    os.system('clear')
    while 1:
        try:
            os.system('clear')
            get_time = input('請輸入倒計時時間(單位:分)')
            if get_time == 'q':
                break
            else:
                os.system('clear')
                daojishi(min=float(get_time))
        except Exception as e:
            print('輸入錯誤,請輸入倒計時分鐘')
            time.sleep(1)

#多天的
def in_some_day():
    os.system('clear')
    while 1:
        try:
            os.system('clear')
            print('請輸入天--時--分')
            get_time_day = input('請輸入倒計時天(單位:天)')
            get_time_hour = input('請輸入倒計時(單位:小時)')
            get_time_min = input('請輸入倒計時分(單位:分鐘)')
            if get_time_day == 'q' or get_time_hour == 'q' or get_time_min == 'q':
                break
            os.system('clear')
            daojishi(day=int(get_time_day), hour=int(get_time_hour), min=int(get_time_min))
        except Exception as e:
            print('輸入錯誤,請輸入倒計時分鐘')
            time.sleep(1)

解決啓動端口

上邊的所有已經解決了99.999%的內容,還差那麼一丁點就是啓動他們,因此再做一個啓動入口:

這個if name…這句有點多餘,但我看別人都這麼寫的,,我就加上吧,誰知道爲嘛這麼寫,請留言!

啓動後先判定計算1天內的,還是計算跨天的,1或2選擇,q鍵加回車退出

判定後啓動上邊的輸入時間函數~一切就那麼順滑。

def qidong():
    while 1:
        os.system('clear')
        cut = input('1爲1天內計時, 2爲多天計時, q退出\n\n請選擇:')
        try:
            if cut == 'q':
                break
            elif int(cut) == 1:
                in_one_day()
            elif int(cut) == 2:
                in_some_day()
            else:
                print('you!輸入錯誤')
                time.sleep(1)

        except Exception as e:
            os.system('clear')
            print('you!輸入錯誤')
            time.sleep(1)


if __name__ == '__main__':
    qidong()

最後,錄個操作過程如下短視頻:
前往觀看


第一時間加入我弄得交流羣, 共同交流Python 數據分析 SQL Hive Web爬蟲等等內容 .

添加vx: rovesoul 邀請你的來到!

公衆號二維碼.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章