繪制動態鍾表的基本思路如下(面向對象的編程):
使用5個turtle對象
1個turtle:繪制外表盤
3個turtle:模擬表針行為
1個turtle:輸出表盤上文字
根據實時時間使用ontimer()函數更新表盤畫面,顯示效果如下:
1 from turtle import * 2 from datetime import * 3 4 def Skip(step):#跨越函數,通過penup()和pendown()實現step像素的跨越操作 5 penup() 6 forward(step) 7 pendown() 8 9 def mkHand(name, length):#定義表針函數#注冊Turtle形狀,建立表針Turtle 10 11 reset()#清空當前窗口,並重置位置等信息為默認值 12 Skip(-length*0.1)#通過skip()設置中心點 13 begin_poly()# 14 forward(length*1.1)#完成繪制幾何形狀 15 end_poly()# 16 handForm = get_poly()#通過get_plpy()將該形狀賦給變量handForm,其類型為shape 17 register_shape(name, handForm) 18 19 def Init():#初始化函數,建立三個指表針turtle對象,和文本turtle對象並對其進行初始化 20 global secHand, minHand, hurHand, printer#四個turtle對象,都通過global聲明為全局對象 21 mode("logo")# 重置Turtle指向北 22 #建立三個表針Turtle並初始化 23 mkHand("secHand", 125) 24 mkHand("minHand", 130) 25 mkHand("hurHand", 90) 26 secHand = Turtle() 27 secHand.shape("secHand") 28 minHand = Turtle() 29 minHand.shape("minHand") 30 hurHand = Turtle() 31 hurHand.shape("hurHand") 32 for hand in secHand, minHand, hurHand:#對三個對象進行初始化 33 hand.shapesize(1, 1, 3) 34 hand.speed(0) 35 #建立輸出文字Turtle 36 printer = Turtle() 37 printer.hideturtle() 38 printer.penup() 39 40 def SetupClock(radius):#表盤繪制函數 41 #建立表的外框 42 reset() 43 pensize(7) 44 for i in range(60):#繪制表盤刻度,每五個刻度畫一個短線斷,其余為小圓點 45 Skip(radius) 46 if i % 5 == 0: 47 forward(20) 48 Skip(-radius-20) 49 else: 50 dot(5) 51 Skip(-radius) 52 right(6) 53 54 def Week(t): 55 week = ["星期一", "星期二", "星期三", 56 "星期四", "星期五", "星期六", "星期日"] 57 return week[t.weekday()] 58 59 def Date(t): 60 y = t.year 61 m = t.month 62 d = t.day 63 return "%s %d %d" % (y, m, d) 64 65 def Tick():#更新時鍾函數 66 #繪制表針的動態顯示 67 t = datetime.today()#獲取當前時間 68 #以下分別計算帶小數的時分秒值 69 second = t.second + t.microsecond*0.000001 70 minute = t.minute + second/60.0 71 hour = t.hour + minute/60.0 72 secHand.setheading(6*second) 73 minHand.setheading(6*minute) 74 hurHand.setheading(30*hour) 75 76 tracer(False) 77 printer.forward(65) 78 printer.write(Week(t), align="center", 79 font=("Courier", 14, "bold")) 80 printer.back(130) 81 printer.write(Date(t), align="center", 82 font=("Courier", 14, "bold")) 83 printer.home()#將turtle對象元素歸位到原點 84 tracer(True) 85 86 ontimer(Tick, 100)#100ms后繼續調用tick 87 88 def main(): 89 tracer(False)#控制刷新,false表示動畫關閉,繪制完成后一次性刷新 90 Init() 91 SetupClock(160) 92 tracer(True)#True參數,恢復動畫刷新 93 Tick() 94 mainloop() 95 96 if __name__ == "__main__": 97 main()