使用Turtle庫繪制動態鍾表


內容引自大學慕課:https://www.icourse163.org/learn/BIT-1002058035?tid=1002161029#/learn/content?type=detail&id=1002877670&cid=1003294687

繪制動態鍾表的基本思路如下(面向對象的編程):

使用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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM