“你告訴爺爺你需要什麼東西呀,爺爺給你準備,佩奇,什麼是佩奇呀?”…
這是一個發生在大山裡的故事,但故事的情節所有人都不會陌生。快過年了,在農村爺爺給城裡的孫子打電話,孫子說想要“佩奇”,為了滿足孩子的心願,爺爺開始滿村子找佩奇…
當除夕夜家人團聚,爺爺開始展示愛心禮物,“硬核佩奇”的出現,驚呆眾人高能反轉,別出心裁的愛跨越了隔代距離,成功博得孫子歡心。
啥是佩奇?已不重要。佩奇是他用搜集的所有資訊,一點一滴的用心創造、編織愛的過程。佩奇是對孫子的關愛、佩奇是對團圓的企盼。
看著爺爺滿村子找佩奇,鼻子有點酸,作為程式猿我想用Python來告訴爺爺,啥是佩奇?用python做一個社會人,這是很久之前的一篇文章,Turtle是自己接觸python之後用到的第一個庫,Trutle這個庫很有意思,很容易得到滿足感,學習完以後自己隨手畫了一個佩奇,佩奇當時沒火沒想到今天火了。畫佩奇的程式碼已經上傳到後臺,公眾號後臺回覆【社會人】即可獲取。今天的文章再次給大家介紹一下Turtle,用它來畫高階一點的東西,話不多說我們開始吧。
程式介紹
在Python中有很多編寫圖形程式的方法,一個簡單的啟動圖形化程式設計的方法是使用Python內嵌的Turtle模組。Turtle是Python內嵌的繪製線、圓以及其他形狀(包括文字)的圖形模組。它很容易學習並且使用簡單。
一個Turtle實際上是一個物件,在匯入Turtle模組時,就建立了物件,然後,可以呼叫Turtle物件的各種方法完成不同的操作。
當建立一個Turtle物件時,它的位置被設定在(0,0)處——視窗的中心,而且它的方向被設定為向右。Turtle模組用筆來繪製圖形。預設情況下,筆是向下的(就像真實的筆尖觸碰著一張紙)。如果筆是向下的,那麼當移動Turtle的時候,它就會繪製出一條從當前位置到新位置的線。
今天我們要畫的是一個可以獲取當前時間的鐘表。
具體實現
因為鐘錶輪廓中是有幾個小黑點的,那麼我們首先需要設定畫筆的動作,抬起畫筆向前一段距離以後再放下
1def Skip(step):
2 turtle.penup()
3 turtle.forward(step)
4 turtle.pendown()
註冊Turtle的形狀,建立一個錶針Turtle,同時記錄多邊形起點和終點。(當前的烏龜位置是多邊形的第一個頂點,多邊形的最後一個頂點將與第一個頂點相連)返回最後記錄的多邊形。
1def mkHand(name, length):
2 turtle.reset()
3 Skip(-length * 0.1)
4 turtle.begin_poly()
5 turtle.forward(length * 1.1)
6 turtle.end_poly()
7 handForm = turtle.get_poly()
8 turtle.register_shape(name, handForm)
因為鐘錶有三個指標,現在需要建立三個錶針Turtle並初始化,同時還需要建立一個輸出文字的Turtle
1def Init():
2 global secHand, minHand, hurHand, printer
3 turtle.mode(“logo”)
4 mkHand(“secHand”, 135)
5 mkHand(“minHand”, 125)
6 mkHand(“hurHand”, 90)
7 secHand = turtle.Turtle()
8 secHand.shape(“secHand”)
9 minHand = turtle.Turtle()
10 minHand.shape(“minHand”)
11 hurHand = turtle.Turtle()
12 hurHand.shape(“hurHand”)
13
14 for hand in secHand, minHand, hurHand:
15 hand.shapesize(1, 1, 3)
16 hand.speed(10)
17
18
19 printer = turtle.Turtle()
20 printer.hideturtle()
21 printer.penup()
現在需要定義時間格式
1def Week(t):
2 week = [“星期一”, “星期二”, “星期三”,
3 “星期四”, “星期五”, “星期六”, “星期日”]
4 return week[t.weekday()]
5
6
7def Date(t):
8 y = t.year
9 m = t.month
10 d = t.day
11 return “%s %d%d” % (y, m, d)
繪製指標的動態顯示
1def Tick():
2
3 t = datetime.today()
4 second = t.second + t.microsecond * 0.000001
5 minute = t.minute + second / 60.0
6 hour = t.hour + minute / 60.0
7 secHand.setheading(6 * second)
8 minHand.setheading(6 * minute)
9 hurHand.setheading(30 * hour)
10
11 turtle.tracer(False)
12 printer.forward(65)
13 printer.write(Week(t), align=”center”,
14 font=(“Courier”, 14, “bold”))
15 printer.back(130)
16 printer.write(Date(t), align=”center”,
17 font=(“Courier”, 14, “bold”))
18 printer.home()
19 turtle.tracer(True)
20
21 # 100ms後繼續呼叫tick
22 turtle.ontimer(Tick, 100)
現在是重頭戲了,繪製鐘錶的輪廓,這的主要邏輯就是一個迴圈,不難於理解。
1def SetupClock(radius):
2 turtle.reset()
3 turtle.pensize(7)
4 for i in range(60):
5 Skip(radius)
6 if i % 5 == 0:
7 turtle.forward(20)
8 Skip(-radius – 20)
9
10 Skip(radius + 20)
11 if i == 0:
12 turtle.write(int(12), align=”center”, font=(“Courier”, 14, “bold”))
13 elif i == 30:
14 Skip(25)
15 turtle.write(int(i / 5), align=”center”, font=(“Courier”, 14, “bold”))
16 Skip(-25)
17 elif (i == 25 or i == 35):
18 Skip(20)
19 turtle.write(int(i / 5), align=”center”, font=(“Courier”, 14, “bold”))
20 Skip(-20)
21 else:
22 turtle.write(int(i / 5), align=”center”, font=(“Courier”, 14, “bold”))
23 Skip(-radius – 20)
24 else:
25 turtle.dot(5)
26 Skip(-radius)
27 turtle.right(6)
寫在最後
學習就是舉一反三,希望你可以用turtle畫出更有意思的東西來。
鐘錶的完整程式碼需要後臺回覆【鐘錶】獲取
【推薦閱讀】