摘要:比如把上面畫正方形的例子稍做變化重復執行次畫正方形開始畫正方形結束右轉度執行后,可以看到,畫出一個非常規整漂亮的組合圖案。
turtle圖形庫源于1966年誕生的Logo語言,是入門Python的有趣工具。因其簡單便捷的圖形化方法、和立即反饋式的繪畫效果,成為眾多編程入門者的首選。相對于大多數入門教材中枯燥的語法學習,和函數、方法的演練來說,turtle的趣味性顯得別具一格、極富效果。
一直希望能用一篇小短文來講清楚turtle,但是嘗試組織了幾次之后,感覺一篇文章門檻還是有點高,最終決定還是分成兩篇,即大家現在看到的“初級篇”和“高級篇”,以利更好的分層次闡述。
一個類庫是否利于入門,首先了要解它的背景,它能做什么,不能做什么,沒有十全十美的事物,不要期望過高。turtle原意是水生的龜類,可以譯成海龜或烏龜。是由1966年Wally Feurzig和Seymour Papert開發出的一種簡單易用的編程語言。我們這里的turtle庫,指的是turtle語言用Python的實現,turtle庫現在已進入Python的內置模塊,位于Lib/turtle.py,用于繪圖。咱們這里選擇turtle庫,主要是用來了解和學習Python的貼身入門、語法入門、面向對像入門、認識方向、角度與顏色、簡單的數學運算、方法定義、循環與遞歸等。
在使用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庫來表達,同樣非常直觀,翻譯成簡單的英文就可以:
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吧!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42974.html
摘要:也就是說明這個參數除了表示圓的半徑面,其正負性還定義了畫圓的方向。入門篇中有個小彩蛋,也就是可以修改的指針外形。通過初始化出多只新,可以同時在一個界面上以不同的繪圖。下面給出一段繪制實時時鐘的代碼,重點部分我已給出注釋。 到目前為止我們通過turtle庫了解了Python的基本語法,包括順序與循環、函數的調用與方法的定義、列表與簡單的數學運算等;也學習了用turtle庫繪圖的基本用...
摘要:現實生活中,有很多圖形是非常有規律性的,這樣的圖形如果使用遞歸算法來實現,程序就會非常簡潔,運行效果也會很好。下面我們來用畫一棵樹,感受一下中的遞歸算法和的克隆功能。 前兩篇文章基本涵蓋了turtle的大部分功能,同時也借由對turtle功能的展示,厘清了Python的一些語法特點,以利于新手入門。但是短短幾個例子,闡述得還是有限,這里再展開兩個知識點,一方面對turtle做個補遺...
摘要:內置模塊繪圖詳解導入庫定義畫筆之后,后面命令要改為畫筆運動命令命令說明設置畫筆移動速度,畫筆繪制的速度范圍整數,數字越大越快設置畫筆的寬度向當前畫筆方向移動像素長度向當前畫筆相反方向移動像素長度順時針移動逆時針移動移動時繪制圖形,缺省時也為Python內置模塊turtle繪圖詳解導入turtle庫import turtlet=turtle(定義畫筆t之后,后面命令turtle要改為t)畫筆運...
摘要:基礎概念畫布畫布就是為我們展開用于繪圖區域我們可以設置它的大小和初始位置。常用的畫布方法有兩個和。設置畫筆的寬度沒有參數傳入返回當前畫筆顏色傳入參數設置畫筆顏色可以是字符串如也可以是元組。 Turtle庫是Python語言中一個很流行的繪制圖像的函數庫,想象一個小烏龜,在一個橫軸為x、縱軸為y的坐標系原點,(0,0)位置開始,它根據一組函數指令的控制,在這個平面坐標系中移動,從而在它爬...
閱讀 2337·2019-08-30 15:44
閱讀 1260·2019-08-30 13:01
閱讀 3306·2019-08-30 11:22
閱讀 3093·2019-08-29 15:23
閱讀 1614·2019-08-29 12:22
閱讀 3366·2019-08-26 13:58
閱讀 3439·2019-08-26 12:17
閱讀 3479·2019-08-26 12:16