(程序開始階段——上一篇博客:https://www.cnblogs.com/love528/p/9873526.html)
代碼資源來自:
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.......