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吧!