海龜繪圖模組 turtle 是 Python 內建的 2D 繪圖系統, 此模組源自於以 turtle 繪圖系統聞名的教育用程式語言 Logo, 它被移植到許多電腦與程式語言中. 此繪圖系統假想一隻海龜站在畫布正中央, 透過指令 (commands) 指揮海龜以向前 (forward), 向後 (backward), 轉向 (left, right) 等動作繪製向量圖. Python 有許多第三方的繪圖套件, 例如 pycairo 與 easygraphics 等可用來繪製 2D 圖形, 但內建的 turtle 繪圖模組簡單易用, 常被用在兒童電腦繪圖課程中.
以下測試參考了如下書籍 :
- 第一次學 Python 就上手 (碁峰, 陳惠貞) 第七章
- 輕鬆學 Python 3-零基礎x彩色圖解x專業入門 (碁峰, 孫宏明) 第四章
使用 turtle 需先用 import 匯入此模組, 通常會用 as 取一個簡稱例如 tt (不建議用 from turtle import * 這種方式匯入, 雖然可以直接呼叫函數較方便, 但容易造成命名衝突, 無此顧慮則可用) :
import turtle as tt
然後就可以呼叫其函數 (方法, 指令) 來繪圖了, 可用的函數列表如下 :
turtle 函數 | 說明 |
forward (px) | 畫筆前進 px 個畫素 (浮點數可), 負數表示後退 |
backward(px) | 畫筆後退 px 個畫素 (浮點數可), 負數表示前進 |
goto(x, y) | 畫筆移動到指定 (x, y) 座標 |
pensize(px) | 設定畫筆線條粗細 (單位=px) |
color(c) | 設定畫筆顏色, 參數可用 'red' 或 '#ff0000' 格式 |
fillcolor(c) | 設定填滿區域之顏色, 參數可用 'red' 或 '#ff0000' 格式 |
begin_fill() | 啟動填滿顏色, 要在繪製圖形區域填滿顏色須先呼叫此函數. |
end_fill() | 填滿顏色時要先呼叫 begin_fill() 才繪圖, 結束後呼叫此函數即填滿 |
dot(d, c) | 繪製實心圓, 參數 d=直徑 (px), c=顏色, 可用 'red' 或 '#ff0000' 格式 |
circle(r, a, s) | 以半徑 r, 弧度 a, 邊數 s 向左畫圓 (弧). |
write(s, e, a, f) | 在畫筆位置寫入字串 s, e=Tru/False (是否要移動畫筆至字串尾端) a='left'/'center'/'right' (對齊方式), f=(字型, 大小, 效果) 元組, 字型例如 'Arial', 大小例如 10, 效果='normal'/'bold'/'italic' |
left(a) | 畫筆向左轉 a 度 (角度, 浮點數可), 角度為負表示右轉 |
right(a) | 畫筆向右轉 a 度 (角度, 浮點數可), 角度為負表示左轉 |
penup() | 抬起畫筆不接觸畫布 (不可繪圖) |
pendown() | 放下畫筆接觸畫布 (可繪圖) |
setheading(a) | 設定畫筆方向為角度 a (0=向右, 90=向上, 180=向左, 270) |
heading() | 傳回目前畫筆之方向角度 (0=向右, 90=向上, 180=向左, 270) |
hideturtle() | 隱藏畫筆位置 |
showturtle() | 顯示畫筆位置 |
speed(s) | 設定畫筆速度等級 (1~10, 數字越大畫筆移動速度越快) |
undo() | 取消上一次動作 |
clear() | 清除畫布上的所有內容 |
注意, left(), right() 只是將畫筆轉向並不會畫線, 但 goto() 會畫線.
下面用互動方式依序輸入繪圖指令, 畫筆 (以箭頭表示) 會依指令逐步繪製出正方形 :
測試 1 : 繪製 100px*100px 正方形 [看原始碼]
D:\test\python>python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import turtle as tt # 匯入模組
>>> tt.heading() # 傳回畫筆預設方向
0.0 # 角度 0=向右
>>> tt.speed() # 傳回畫筆目前速度
3 # 預設速度 3
>>> tt.color() # 傳回畫筆目前顏色
('black', 'black') # 預設黑色
>>> tt.fillcolor() # 傳回區域預設填滿顏色 (黑色)
'black' # 預設黑色
>>> tt.showturtle() #在畫布中心點顯示畫筆 (其實是一個箭頭, 不是海龜)
>>> tt.forward(100) #畫筆向前畫 100 px (預設向右)
>>> tt.left(90) #畫筆方向左轉 90 度 (即向上)
>>> tt.forward(100) #畫筆向前畫 100 px (向上)
>>> tt.left(90) #畫筆方向左轉 90 度 (即向左)
>>> tt.forward(100) #畫筆向前畫 100 px (向左)
>>> tt.left(90) #畫筆方向左轉 90 度 (即向下)
>>> tt.forward(100) #畫筆向前畫 100 px (向下)
執行第一個 turtle 指令 tt.heading() 就會跳出一個大小約為 970*860 的 Python Turtle Graphics 視窗, 也就是 turtle 的畫布, 預設會在畫布中央顯示一個方向朝右的箭頭 (畫筆) :
繪製過程有點像動畫, 很有趣, 所以才會納入兒童資訊教學中, 最後繪製結果如下 :
如果最後再呼叫 hideturtle() 就可以讓結束的畫筆箭頭消失.
下面測試 2 則是在畫好的正方形內填滿顏色 :
測試 2 : 繪製 100px*100px 正方形後填滿顏色 [看原始碼]
import turtle as tt
tt.pensize(3)
tt.color('blue')
tt.fillcolor('yellow')
tt.begin_fill()
tt.showturtle()
tt.forward(100)
tt.left(90)
tt.forward(100)
tt.left(90)
tt.forward(100)
tt.left(90)
tt.forward(100)
tt.hideturtle()
tt.end_fill()
此例先設好畫筆線條大小為 3px, 顏色為藍色, 填滿顏色為黃色, 然後呼叫 fill_begin() 啟動填滿才開始畫正方形, 完成後再呼叫 fill_end() 就會將此正方形填滿顏色了, 結果如下 :
下面範例則是用 goto() 移動座標位置後繪製一個 300x300 的菱形 :
測試 3 : 在指定起始座標繪製 300x300 的菱形 [看原始碼]
import turtle as tt
tt.pensize(3)
tt.color('red')
tt.setheading(-45)
tt.penup()
tt.goto(-200,100)
tt.pendown()
tt.forward(300)
tt.left(90)
tt.forward(300)
tt.left(90)
tt.forward(300)
tt.left(90)
tt.forward(300)
注意, 在 goto() 之前必須先呼叫 penup() 將畫筆離開畫布; 呼叫 goto() 後再呼叫 pendown() 將畫筆放下, 否則會有一條從畫布中心連到 goto() 座標位置的線出現, 結果如下 :
沒有留言:
張貼留言