2021年1月12日 星期二

Python 學習筆記 : 海龜繪圖模組 turtle

海龜繪圖模組 turtle 是 Python 內建的 2D 繪圖系統, 此模組源自於以 turtle 繪圖系統聞名的教育用程式語言 Logo, 它被移植到許多電腦與程式語言中. 此繪圖系統假想一隻海龜站在畫布正中央, 透過指令 (commands) 指揮海龜以向前 (forward), 向後 (backward), 轉向 (left, right) 等動作繪製向量圖. Python 有許多第三方的繪圖套件, 例如 pycairo 與 easygraphics 等可用來繪製 2D 圖形, 但內建的 turtle 繪圖模組簡單易用, 常被用在兒童電腦繪圖課程中. 

以下測試參考了如下書籍 :
  1. 第一次學 Python 就上手 (碁峰, 陳惠貞) 第七章
  2. 輕鬆學 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() 座標位置的線出現, 結果如下 :





沒有留言 :