1. 程式人生 > >Python入門——實現簡易數碼時鐘

Python入門——實現簡易數碼時鐘

最近迷上了Python,要說為什麼呢?Python語法簡單,功能強大,有廣泛的第三方庫能快速程式設計實現自己的想法(無需重複去造輪子)。就像某位前輩說的:“人生苦短,學會偷懶…”,配置好sublime text照著網上教程直接上手寫個小程式入門。

先插張圖,計算機技術的演進過程,總結的還是挺到位的。

安裝好Python環境,引入需要用到的庫:

import threading
import turtle
import time

引入time庫後使用localtime()方法可以獲取當前伺服器時間,然後使用turtle庫繪製7段數碼管時鐘。

now = time.localtime()  # 返回伺服器時間

print(now)
print(time.strftime("%Y-%m-%d %H:%M:%S", now))

# 轉成字串
# %y 兩位數的年份表示(00-99)
# %Y 四位數的年份表示(000-9999)
# %m 月份(01-12)
# %d 月內中的一天(0-31)
# %H 24小時制小時數(0-23)
# %I 12小時制小時數(01-12)
# %M 分鐘數(00=59)
# %S 秒(00-59)
# %a 本地簡化星期名稱
# %A 本地完整星期名稱
# %b 本地簡化的月份名稱
# %B 本地完整的月份名稱
# %c 本地相應的日期表示和時間表示
# %j 年內的一天(001-366)
# %p 本地A.M.或P.M.的等價符
# %U 一年中的星期數(00-53)星期天為星期的開始
# %w 星期(0-6),星期天為星期的開始
# %W 一年中的星期數(00-53)星期一為星期的開始
# %x 本地相應的日期表示
# %X 本地相應的時間表示
# %Z 當前時區的名稱
# %% %號本身

繪製數碼管函式:

# 繪製單根數碼管
def drawLine(draw):
    turtle.pensize(3)
    turtle.pu
    turtle.fd(3)
    if draw:
        turtle.pd()
    else:
        turtle.pu()

    turtle.fd(24)
    turtle.pu()
    turtle.fd(3)
    turtle.right(90)


# 根據數字繪製數碼管
def drawNum(num, color):
    turtle.colormode(255)
    turtle.color(eval(color))
    # 第一條線
    if num in [2, 3, 4, 5, 6, 8, 9]:
        drawLine(True)
    else:
        drawLine(False)

    if num in [0, 1, 3, 4, 5, 6, 7, 8, 9]:
        drawLine(True)
    else:
        drawLine(False)

    if num in [0, 2, 3, 5, 6, 8, 9]:
        drawLine(True)
    else:
        drawLine(False)

    if num in [0, 2, 6, 8]:
        drawLine(True)
    else:
        drawLine(False)

    turtle.left(90)

    if num in [0, 4, 5, 6, 8, 9]:
        drawLine(True)
    else:
        drawLine(False)

    if num in [0, 2, 3, 5, 6, 7, 8, 9]:
        drawLine(True)
    else:
        drawLine(False)

    if num in [0, 1, 2, 3, 4, 7, 8, 9]:
        drawLine(True)
    else:
        drawLine(False)

    turtle.pu()
    turtle.left(180)
    turtle.fd(30)  # 繪製後面數字間隔位置
    turtle.update()

一個7段數碼管全部繪製(顯示數字8)順序如下,根據顯示的數字來決定哪些需要繪製,哪些只是擡起畫筆移動不進行繪製,所以繪製單段數碼管的函式內設定了一個引數draw。

定義一個Tick函式,利用threading庫實現定時重新整理:

def Tick():
    now = time.localtime()
    now_time.n_sec = now.tm_sec
    turtle.reset()
    turtle.hideturtle()
    turtle.pu()
    turtle.fd(-300)

    darwDate(str(now.tm_year), '(255, 69, 0)')
    turtle.fd(10)
    turtle.right(90)
    turtle.fd(30)
    turtle.write('年', align="center", font=("Courier", 30, "bold"))
    turtle.left(180)
    turtle.fd(30)
    turtle.right(90)
    turtle.fd(30)

    darwDate(str(now.tm_mon), '(0,139,0)')
    turtle.fd(10)
    turtle.right(90)
    turtle.fd(30)
    turtle.write('月', align="center", font=("Courier", 30, "bold"))
    turtle.left(180)
    turtle.fd(30)
    turtle.right(90)
    turtle.fd(30)

    darwDate(str(now.tm_mday), '(0,0,139)')
    turtle.fd(10)
    turtle.right(90)
    turtle.fd(30)
    turtle.write('日', align="center", font=("Courier", 30, "bold"))
    turtle.left(180)
    turtle.fd(-90)
    turtle.right(90)
    turtle.fd(-510)

    darwDate(str(now.tm_hour))
    turtle.fd(10)
    turtle.right(90)
    turtle.fd(30)
    turtle.write('時', align="center", font=("Courier", 30, "bold"))
    turtle.left(180)
    turtle.fd(30)
    turtle.right(90)
    turtle.fd(30)

    darwDate(str(now.tm_min))
    turtle.fd(10)
    turtle.right(90)
    turtle.fd(30)
    turtle.write('分', align="center", font=("Courier", 30, "bold"))
    turtle.left(180)
    turtle.fd(30)
    turtle.right(90)
    turtle.fd(30)

    darwDate(str(now.tm_sec))
    turtle.fd(10)
    turtle.right(90)
    turtle.fd(30)
    turtle.write('秒', align="center", font=("Courier", 30, "bold"))
    turtle.left(180)
    turtle.fd(30)
    turtle.right(90)
    turtle.fd(30)

    timer = threading.Timer(0.1, Tick)  # 利用多執行緒庫定時重新整理
    timer.start()

最後定義一個入口函式:

def mian():
    turtle.hideturtle()  # 隱藏畫筆
    turtle.speed(0)  # 最快
    turtle.tracer(0)
    turtle.pu()
    turtle.fd(-300)
    Tick()
    turtle.done()
# Python turtle模組的海龜作圖,由於需要展示海龜運動的過程,預設狀態下,對作圖進行了延遲處理,
# 致使複雜圖形的繪製速度過慢,可以用如下方法取消延遲,加速繪圖:
# 在繪圖之前呼叫tracer
# turtle.tracer(0)
# 在繪圖結束時呼叫update
# turtle.update()

mian()

最終效果:

程式碼寫好後,可以打包成一個可執行檔案,這裡需要用到第三方庫PyInstaller;安裝第三方庫Python封裝了包管理工具pip確保安裝時勾選了pip和Add python.exe to Path)。這裡我用線上安裝的方式,在cmd視窗直接執行:pip install 包名,如 pip install pyInstaller,注意:這種方式安裝時會自動下載第三方庫,安裝完成後並不會刪除,如需刪除請到它的預設下載路徑下手動刪除。(win7的預設路徑://AppData可能是隱藏資料夾 c:\使用者\(你的使用者名稱)\AppData\Local\pip\cache\ linux的預設路徑: ~/.cache/pip)

耐心等待下載並安裝後,就可以使用PyInstaller了,在需要打包的檔案目錄下執行pyinstaller -F指令:

打包後生成獨立執行檔案time.exe:

打包時還可以通過–icon指令設定指定的圖示,還有更多指令等以後用到的時候再研究。用了一段時間的Python,因為語法簡潔所以程式碼的縮排很重要,這也算是一個小坑吧,不過熟能生巧,還需多多練習。