1. 程式人生 > >第一個python小程式——即時動態時鐘(程式碼解讀)

第一個python小程式——即時動態時鐘(程式碼解讀)

程式碼資源來自:

http://n.miaopai.com/media/K9Qlou7rdPc5TxpPaL1VDvwfv5hP~lHK   (執行有錯誤,缺少date,week和結尾部分)

https://blog.csdn.net/yangxing2/article/details/78637472/

一、完整程式碼:

# coding=UTF-8
from turtle import *
from datetime import *

def Skip(step):               #建立表的外框
    penup()
    forward(step)
    pendown()

def mkHand(name,length): #註冊turtle形狀,建立錶針turtle reset() Skip(-length*0.1) begin_poly() forward(length*1.1) end_poly() handForm = get_poly() register_shape(name,handForm) def Init(): global secHand,minHand,hurHand,printer mode("logo") #重置turtle指向北 mkHand(
"secHand",125) #建立三個錶針並初始化 mkHand("minHand",130) mkHand("hurHand",90) secHand = Turtle() secHand.shape("secHand") minHand = Turtle() minHand.shape("minHand") hurHand = Turtle() hurHand.shape("hurHand") for hand in secHand,minHand,hurHand: hand.shapesize(
1,1,3) hand.speed(0) printer = Turtle() #建立輸出文字turtle printer.hideturtle() printer.penup() def SetupClock(radius): #建立表外框 reset() pensize(7) for i in range(60): Skip(radius) if i % 5 == 0: forward(20) Skip(-radius-20) else: dot(5) Skip(-radius) right(6) def Week(t): week = ["Mon", "Tues", "Wed","Thur", "Fri", "Sat", "Sun"] return week[t.weekday()] def Date(t): y = t.year m = t.month d = t.day return "%s %d %d" % (y, m, d) def Tick(): t = datetime.today() second = t.second + t.microsecond * 0.000001 minute = t.minute + second/60.0 hour = t.hour + minute/60.0 secHand.setheading(6*second) minHand.setheading(6*minute) hurHand.setheading(30*hour) tracer(False) printer.forward(65) printer.write(Week(t),align="center",font=("Courier",14,"bold")) printer.back(130) printer.write(Date(t),align="center",font=("Courier",14,"bold")) printer.home() tracer(True) ontimer(Tick,100) #100ms後繼續呼叫tick def main(): tracer(False) Init() SetupClock(160) tracer(True) Tick() mainloop() if __name__ == "__main__": main()

二、執行結果截圖

三、程式解讀

1、思路

  需求:5個Turtle物件, 1個繪製外表盤+1個輸出文字++3個模擬表上針
  Step1:建立5個Turtle物件並初始化 (錶盤繪製和文字輸出物件是turtle常見的物件方式;turtle的外觀shape就是指標形狀,在每一時刻以軸心為圓心旋轉了一定角度)
  Step2:靜態錶盤繪製 
  Step3:根據時鐘更新錶針位置與時間資訊 
  基本庫:Turtle、datetime

2、程式碼

(1)from turtle import *

  Turtle庫——Python語言中一個很流行的繪製圖像的函式庫,想象一個小烏龜(畫筆),在一個橫軸為x、縱軸為y的座標系(畫布),根據一組函式指令的控制,在平面座標系中移動,從而在它爬行的路徑上繪製了圖形。

        操縱海龜繪圖有3種命令:

    運動命令

    

    畫筆控制命令

    

    全域性控制命令

     

    還有其他命令

    

(2)from datetime import *

  datetime模組重新封裝了time模組,提供了更多處理日期和時間的介面。包含以下幾個類和兩個常量:

  

  

  每個類中定義了很多屬性和方法,包括對時間的呼叫及格式轉換等問題在此不再贅述。

(3)幾個重要的函式  (程式碼中的函式寫成mode(),而不用寫成turtle.mode(),是因為turtle是python的標準庫,在python專案裡不會提示“unresolved reference ‘xxx’”,但在直譯器為python2.7的python檔案中不會有提示。此提示不影響程式碼執行)

  SetupClock(radius):        繪製錶盤,錶盤半徑radius為引數

    設定畫筆大小,通過60次迴圈繪製刻度,每5個刻度為短線段,其餘為小圓點。

  Skip(step):                       由於錶盤刻度不連續,需頻繁擡起畫筆,放下畫筆

  mkHand(name,length):    定義指標幾何形狀。

    使用兩個函式begin_poly() 、end_poly()記錄多邊形形狀,register_shape函式將handForm幾何形狀註冊為合法的turtle外形.

  Init():                                初始化錶針和文字物件

  Tick():                              繪製錶針的動態顯示

    獲取當前的時分秒,設定每個指標轉動的角度,繪製星期與日期文字,每隔100ms呼叫此函式更新時間

  tracer(False) :                  實現繪製的效果同時出現,用tracer函式控制重新整理,false時動畫關閉,繪製結束後一致重新整理;true時恢復動畫的繪製效果

     mainloop():                      啟動事件迴圈 -呼叫Tkinter的mainloop函式。必須是烏龜圖形程式中的最後一個語句。

 

 

 

the end.......