Python易學就會(三)turtle繪圖入門--初級篇

  turtle圖形庫源於1966年誕生的Logo語言,是入門Python的有趣工具。因其簡單便捷的圖形化方法、和當即反饋式的繪畫效果,成爲衆多編程入門者的首選。相對於大多數入門教材中枯燥的語法學習,和函數、方法的演練來講,turtle的趣味性顯得別具一格、極富效果。編程

  一直但願能用一篇小短文來說清楚turtle,可是嘗試組織了幾回以後,感受一篇文章門檻仍是有點高,最終決定仍是分紅兩篇,即你們如今看到的「初級篇」和「高級篇」,以利更好的分層次闡述。小程序

  一個類庫是否利於入門,首先了要解它的背景,它能作什麼,不能作什麼,沒有十全十美的事物,不要指望太高。turtle原意是水生的龜類,能夠譯成海龜或烏龜。是由1966年Wally Feurzig和Seymour Papert開發出的一種簡單易用的編程語言。咱們這裏的turtle庫,指的是turtle語言用Python的實現,turtle庫如今已進入Python的內置模塊,位於Lib/turtle.py,用於繪圖。我們這裏選擇turtle庫,主要是用來了解和學習Python的貼身入門、語法入門、面向對像入門、認識方向、角度與顏色、簡單的數學運算、方法定義、循環與遞歸等。segmentfault

  在使用turtle庫以前最重要的事,是須要認識turtle的兩個座標、角度系統:standard和logo。以下圖所示:編程語言

圖片描述

  這裏standard模式,也就是標準座標系,在turtle庫的使用過程當中,默認使用這套座標、角度系統,即以繪圖界面的中心點爲座標圓點(0,0),以x座標正方向爲0度角,逆時針旋轉。不要小看這簡單的三句話,這是最基礎的約定前提,請熟記於胸,不然編程的時候,容易懵的。函數

  除了standard標準座標系外,在turtle庫的編程中還常用另一套座標、角度系統,叫作logo!對,就是那個Logo,那個原來的獨立編程語言,這套logo座標、角度系統就是用來跟原logo兼容的,對於瞭解過Logo語言的用戶來講,會更加熟悉,上圖:工具

圖片描述

  看出差異來了嗎,logo座標系是以繪圖界面的中心點爲座標圓點(0,0),以y座標正方向爲0度角,順時針旋轉。跟standard座標不一樣的地方在於0度方向的選擇,和旋轉方式。在編程中使用 mode() 方法進行切換。學習

# 切換座標、角度系統
# mode('standard')
mode('logo')

  因此,若是見到這個方法,您首先得切換本身大腦中的座標、角度系統。:)這是編程的底層邏輯,必需先弄清楚。優化

  接下來,再認識turtle的畫圖方式:落筆、擡筆、清空、設置顏色、粗細等等。動畫

  如何讓這隻烏龜在界面上畫一條線呢,就如同我們用筆寫字同樣,須要用通過「落筆」、「劃過」、「擡筆」、「結束」的過程,用turtle庫來表達,一樣很是直觀,翻譯成簡單的英文就能夠:spa

import turtle as t     # 導入turtle庫
t.pendown()            # 落筆
t.forward(300)         # 劃過300個單位的長度
t.penup()              # 擡筆
t.done()               # 結束

  在IDE中鍵入這段代碼,執行,就能看到在窗口上畫出了這樣一條直線。「#」號後面的是註釋。(IDE的選擇及環境安裝見《第一節》

  用turtle畫出了Python的第一條直線以後,接着來看看怎麼「轉彎」。下面以繪製一個正方形爲例子,演示turtle怎麼前進、怎麼左轉、右轉。

import turtle as t     # 導入turtle庫
t.pendown()            # 落筆
t.forward(100)         # 劃過100個單位的長度
t.left(90)             # 左轉90度
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
t.penup()              # 擡筆
t.done()               # 結束

  在IDE中鍵入這段代碼,執行,就能看到在窗口上畫出了一個標準的正方形。

  有一點編程基礎的小夥伴,當即就能夠看出來,上面代碼中有四組相同的語句,嗯,這不是能夠用循環來實現嗎?沒錯,改進一下:

import turtle as t
t.pendown()
for j in range(4):    # 重複執行4次
    t.forward(100)
    t.left(90)
t.penup()
t.done()

  放到IDE中執行,能夠看到效果跟順序執行的徹底一致。range()是Python的內置函數,這裏表示循環執行的次數。

  注意縮進,Python中不使用括號來表示語句塊,而靠冒號:和後面的縮進(空格縮進)來表示語句塊。所以縮進成爲了語法的一部分,要嚴格遵循,從其它語言轉過來的小夥伴須要習慣一下。

  學習任何一項新知識,就像爬坡同樣,有個量變積累到質變的過程。接下來就來寫一個烏龜爬坡的小程序吧,上代碼:

import turtle as t
t.pendown()
t.forward(50)
t.left(90)             # 左轉90度
t.forward(50)
t.right(90)            # 右轉90度
t.forward(50)
t.left(90)
t.forward(50)
t.right(90)            # 右轉90度
t.forward(50)
t.left(90)
t.forward(50)
t.right(90)            # 右轉90度
t.penup()
t.done()

  放到IDE中執行,能夠看到一段3次爬坡的動畫。left(90)是向左轉動90度;right(90)是向右轉動90度。固然這3次爬坡,也是能夠用順序來作的,代碼以下:

import turtle as t
t.pendown()
for j in range(3):         # 重複執行3次
    t.forward(50)
    t.left(90)             # 左轉90度
    t.forward(50)
    t.right(90)            # 右轉90度
t.penup()
t.done()

  for循環的執行效果,跟順序執行的徹底同樣,更改range(3)的參數,能夠執行不一樣的次數。

  彩蛋來了:turtle既然是烏龜,我怎麼畫到如今沒有看到一隻烏龜呢?的確有點奇怪,明明是一個小箭頭一直在畫畫,爲何要說成是turtle烏龜呢?

  不要着急,加一行小代碼,烏龜當即出現:

t.shape('turtle')

  把這行代碼,加到「落筆」的前面,就會發現小箭頭變成小烏龜了,仍是挺萌吧!上面畫直線、畫正方形、爬坡三個例子你均可以加上試試試試!

  上面的left(90)和right(90)分別表示左轉90度和右轉90度,那怎麼設置烏龜的角度,讓它向咱們指定的任意方向前進呢?嗯,調整90這個參數,在界面上畫一個本身的名字吧!哦,中文就算了,畫出來太複雜,畫個拼音首字母仍是能夠的,上代碼:

import turtle as t
t.mode('logo')        # 切換成Logo座標、角度系統
t.shape('turtle')     # 顯示出小烏龜
t.penup()             # 擡筆,先不要畫
t.goto(-200, 100)     # 移動到起始點
t.setheading(180)     # 設置要畫的方面,Logo座標的180度方向,即向下
t.pendown()           # 落筆,準備開始畫第一個字母
t.forward(200)
t.left(90)
t.forward(100)
t.penup()             # 第一個字母"L"畫完,擡筆

t.forward(100)        # 到達第二個字母的起始位置
t.pendown()           # 落筆,準備開始畫第二個字母
t.left(90)
t.forward(200)
t.right(135)
t.forward(100)
t.left(90)
t.forward(100)
t.right(135)
t.forward(200)
t.penup()             # 第二個字母"M"畫完,擡筆
t.done()

  在IDE中運行這段代碼,能夠看到小烏龜在窗口左側畫了兩個大寫的字母「L」和「M」。須要注意的地方是,程序中使用mode('logo')切換到了Logo的座標、角度系統,setheading(180)將小烏龜的前進方向設置爲Logo座標的180度方向,即向下的方向,若是有疑問,能夠參考本文開篇時對座標系的描述。

  goto(x, y)是一個新方法,可讓小烏龜去到界面上的任意一個座標點。(固然,畫名字的這個小例子,若是所有使用goto(x,y)會比使用forward()要簡單不少,具體代碼你能夠本身嘗試)

  配合for循環、forward()和角度度化,可讓turtle在變與不變中創造出不少有意思的圖形。好比把上面畫正方形的例子稍作變化:

import turtle as t
t.pendown()
for j in range(10):    # 重複執行10次
    # 畫正方形-開始
    t.forward(100)         
    t.left(90)
    t.forward(100)
    t.left(90)
    t.forward(100)
    t.left(90)
    t.forward(100)
    t.left(90)             # 畫正方形-結束
    # 右轉36度
    t.right(36)            
t.penup()
t.done()

  執行後,能夠看到,畫出一個很是規整、漂亮的組合圖案。

  填充,可讓turtle的圖形更炫麗。主要有如下幾個方法:

t.pencolor('red')        #設置畫筆的顏色
t.fillcolor('green')     #設置填充的顏色
t.begin_fill()           #開始填充
t.end_fill()             #結束填充

  下面來改造一下咱們前面畫正方形的例子,

import turtle as t
t.pencolor('red')        #設置畫筆的顏色
t.fillcolor('green')     #設置填充的顏色
t.pendown()
t.begin_fill()           #開始填充
for j in range(4):
    t.forward(100)
    t.left(90)
t.end_fill()             #結束填充
t.penup()
t.done()

  執行一下,能夠看到turtle畫出一個紅色邊框的實心綠正方形。

  在Python中使用def進行方法定義或者叫函數定義,可讓指揮turtle畫畫這件事,更輕鬆一點。再次改造一下上面畫正方形的例子:

import turtle as t

def drawRect():            # 定義一個函數,名爲 drawRect()
    t.pendown()
    for j in range(4):
        t.forward(100)
        t.left(90)
    t.penup()
    
drawRect()                 # 調用這個函數
t.done()

  在這個例子中,咱們使用def定義了一個函數,名爲drawRect(),內容就是帶一個正方形,跟前面的描述同樣。

  自定義好函數之後,只要調用這個函數名,就能夠執行函數體內的代碼內容。咱們再來豐富一下這個例子,對上面畫多個正方形的例子進行優化:

import turtle as t

def drawRect():            # 定義函數
    t.pendown()
    for j in range(4):
        t.forward(100)
        t.left(90)
    t.penup()
    
for j in range(10):        # 重複執行10次
    drawRect()             # 調用這個自定義的函數
    t.right(36)
    
t.done()

  執行一下,可見效果同樣,可是代碼更爲簡潔,可讀性更好。

  下面給這段代碼加上填充效果:

import turtle as t

def drawRect():
    t.pendown()
    for j in range(4):
        t.forward(100)
        t.left(90)
    t.penup()
    
clrs = ['red', 'green', 'blue', 'gray', 'brown'] # 顏色列表
for j in range(10): 
    t.fillcolor(clrs[j % 5])                      # 從列表中選擇顏色
    t.begin_fill()                                # 開始填充
    drawRect()
    t.end_fill()                                  # 結束填充
    t.right(36)
    
t.done()

  運行一下這個小例子,能夠看到,turtle畫出了用五種不一樣顏色填充的正方形組合圖案。例子中爲了使得每一個正方形填充的顏色不同,咱們先定義了一個顏色列表clrs,列表clrs中預先存入了5個顏色。在for循環中,每次執行時根據j值的變化,用取餘數%的方式,每次取到不重複的顏色。

  固然,turtle的功能不僅於此,對於Python的入門者來講,經過turtle生動的例子,能夠畫漂亮的圖形,也能夠同時熟悉Python的語法和規則,何樂而不爲呢?

  期待咱們下一節《高級篇》,用turtle畫更有趣的圖形、更深刻的應用Python吧!

相關文章
相關標籤/搜索