「你告訴爺爺你須要什麼東西呀,爺爺給你準備,佩奇,什麼是佩奇呀?」...python
這是一個發生在大山裏的故事,但故事的情節全部人都不會陌生。快過年了,在農村爺爺給城裏的孫子打電話,孫子說想要「佩奇」,爲了知足孩子的心願,爺爺開始滿村子找佩奇…算法
當除夕夜家人團聚,爺爺開始展現愛心禮物,「硬核佩奇」的出現,驚呆衆人高能反轉,別出心裁的愛跨越了隔代距離,成功博得孫子歡心。機器學習
啥是佩奇?已不重要。佩奇是他用搜集的全部信息,一點一滴的用心創造、編織愛的過程。佩奇是對孫子的關愛、佩奇是對團圓的企盼。ide
看着爺爺滿村子找佩奇,鼻子有點酸,做爲程序猿我想用Python來告訴爺爺,啥是佩奇?用python作一個社會人,這是好久以前的一篇文章,Turtle是本身接觸python以後用到的第一個庫,Trutle這個庫頗有意思,很容易獲得知足感,學習完之後本身隨手畫了一個佩奇,佩奇當時沒火沒想到今天火了。畫佩奇的代碼已經上傳到後臺,公衆號後臺回覆【社會人】便可獲取。今天的文章再次給你們介紹一下Turtle,用它來畫高級一點的東西,話很少說咱們開始吧。
程序介紹學習
在Python中有不少編寫圖形程序的方法,一個簡單的啓動圖形化程序設計的方法是使用Python內嵌的Turtle模塊。Turtle是Python內嵌的繪製線、圓以及其餘形狀(包括文本)的圖形模塊。它很容易學習而且使用簡單。設計
一個Turtle其實是一個對象,在導入Turtle模塊時,就建立了對象,而後,能夠調用Turtle對象的各類方法完成不一樣的操做。3d
當建立一個Turtle對象時,它的位置被設定在(0,0)處——窗口的中心,並且它的方向被設置爲向右。Turtle模塊用筆來繪製圖形。默認狀況下,筆是向下的(就像真實的筆尖觸碰着一張紙)。若是筆是向下的,那麼當移動Turtle的時候,它就會繪製出一條從當前位置到新位置的線。指針
今天咱們要畫的是一個能夠獲取當前時間的鐘表。
具體實現orm
由於鐘錶輪廓中是有幾個小黑點的,那麼咱們首先須要設置畫筆的動做,擡起畫筆向前一段距離之後再放下對象
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畫出更有意思的東西來。
鐘錶的完整代碼須要後臺回覆【鐘錶】獲取
【推薦閱讀】