除了畫佩奇咱們還要玩點更高級的

「你告訴爺爺你須要什麼東西呀,爺爺給你準備,佩奇,什麼是佩奇呀?」...python

這是一個發生在大山裏的故事,但故事的情節全部人都不會陌生。快過年了,在農村爺爺給城裏的孫子打電話,孫子說想要「佩奇」,爲了知足孩子的心願,爺爺開始滿村子找佩奇…bash

當除夕夜家人團聚,爺爺開始展現愛心禮物,「硬核佩奇」的出現,驚呆衆人高能反轉,別出心裁的愛跨越了隔代距離,成功博得孫子歡心。ide

啥是佩奇?已不重要。佩奇是他用搜集的全部信息,一點一滴的用心創造、編織愛的過程。佩奇是對孫子的關愛、佩奇是對團圓的企盼。學習

看着爺爺滿村子找佩奇,鼻子有點酸,做爲程序猿我想用Python來告訴爺爺,啥是佩奇?用python作一個社會人,這是好久以前的一篇文章,Turtle是本身接觸python以後用到的第一個庫,Trutle這個庫頗有意思,很容易獲得知足感,學習完之後本身隨手畫了一個佩奇,佩奇當時沒火沒想到今天火了。畫佩奇的代碼已經上傳到後臺,公衆號後臺回覆【社會人】便可獲取。今天的文章再次給你們介紹一下Turtle,用它來畫高級一點的東西,話很少說咱們開始吧。 程序介紹ui

在Python中有不少編寫圖形程序的方法,一個簡單的啓動圖形化程序設計的方法是使用Python內嵌的Turtle模塊。Turtle是Python內嵌的繪製線、圓以及其餘形狀(包括文本)的圖形模塊。它很容易學習而且使用簡單。spa

一個Turtle其實是一個對象,在導入Turtle模塊時,就建立了對象,而後,能夠調用Turtle對象的各類方法完成不一樣的操做。設計

當建立一個Turtle對象時,它的位置被設定在(0,0)處——窗口的中心,並且它的方向被設置爲向右。Turtle模塊用筆來繪製圖形。默認狀況下,筆是向下的(就像真實的筆尖觸碰着一張紙)。若是筆是向下的,那麼當移動Turtle的時候,它就會繪製出一條從當前位置到新位置的線。3d

今天咱們要畫的是一個能夠獲取當前時間的鐘表。指針

具體實現code

由於鐘錶輪廓中是有幾個小黑點的,那麼咱們首先須要設置畫筆的動做,擡起畫筆向前一段距離之後再放下

1def Skip(step):
2    turtle.penup()
3    turtle.forward(step)
4    turtle.pendown()
複製代碼

註冊Turtle的形狀,創建一個錶針Turtle,同時記錄多邊形起點和終點。(當前的烏龜位置是多邊形的第一個頂點,多邊形的最後一個頂點將與第一個頂點相連)返回最後記錄的多邊形。

def 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

def 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()
複製代碼

如今須要定義時間格式

def 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)
複製代碼

繪製指針的動態顯示

def 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)

複製代碼

如今是重頭戲了,繪製鐘錶的輪廓,這的主要邏輯就是一個循環,不難於理解。

def 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畫出更有意思的東西來。 鐘錶的完整代碼須要關注公衆號【Ahab雜貨鋪】後臺回覆【鐘錶】獲取 【推薦閱讀】

致青春--Python實現俄羅斯方塊

【Python爬蟲】Urllib的使用(2)

相關文章
相關標籤/搜索