海龜繪圖簡易教程|Turtle for Python
turtle 是 python 內建的一個比較有趣味的模組,俗稱 海龜繪圖,它是基於 tkinter 模組打造,提供一些簡單的繪圖工具,海龜作圖最初源自 20 世紀 60 年代的 Logo 程式語言,之後一些很酷的 Python 程式設計師構建了 turtle 庫,讓其他程式設計師只需要 import turtle,就可以在 Python 中使用海龜作圖。
1. 基本功能介紹
在海龜作圖中,我們可以編寫指令讓一個虛擬的(想象中的)海龜在螢幕上來回移動。這個海龜帶著一隻鋼筆,我們可以讓海龜無論移動到哪都使用這隻鋼筆來繪製線條。通過編寫程式碼,以各種很酷的模式移動海龜,我們可以繪製出令人驚奇的圖片。使用海龜作圖,我們不僅能夠只用幾行程式碼就創建出令人印象深刻的視覺效果,而且還可以跟隨海龜看看每行程式碼如何影響到它的移動。這能夠幫助我們理解程式碼的邏輯。所以海龜作圖也常被用作新手學習 Python 的一種方式。
1.1 Turtle motion (運動控制)
本節中包含了 運動控制 中常用的一些函式
turtle.goto(x,y)
畫筆定位到座標(x,y)
turtle.forward(distance)
向正方向運動 distance 長的距離
turtle.backward(distance)
向負方向運動 distance 長的距離
turtle.right(angle)
向右偏 angle 度
turtle.left(angle)
向左偏 angle 度
turtle.home()
回到原點
turtle.circle(radius, extent=None, steps=None)
畫圓形 radius 為半徑,extent 為圓的角度
turtle.speed(speed)
以 speed 速度運動
看到這麼多函式肯定已經頭大了,我們以例題來講解。
首先畫一個邊長為100的正方形,然後再以半徑為50畫出其3/4圓。
# 控制畫筆的速度
turtle.speed(5)
# 將畫筆定位到原點
turtle.goto(0,0)
# 從原點開始,畫出一個邊長為100的正方形
for i in range(4):
# 正向運動 100 的距離
turtle.forward(100)
# 向右偏 90 度
turtle.right(90)
# 將畫筆定位到原點
turtle.home()
# 畫出一個半徑為100,佔3/4的圓
turtle.circle(50,270)
最後得到以下結果:
1.2 Pen control (畫筆控制)
本節包含了對畫筆的控制函式,常用的如下:
turtle.pendown()
落筆,在此狀態下會畫出運動的軌跡
turtle.penup()
起筆,在此狀態下不會畫出運動的軌跡
turtle.pensize(width=None
畫筆粗細
turtle.pencolor(*args)
畫筆顏色
turtle.fillcolor(*args)
填充顏色
turtle.begin_fill()
開始填充
turtle.end_fill()
結束填充
turtle.write(arg, move=False, align=”left”, font=(“Arial”, 8, “normal”))
寫文字
同樣,我們以一個例題來講解。
畫一個正方形並填充,最後寫一些文字
# 控制畫筆顏色
turtle.pencolor('red')
# 落筆
turtle.pendown()
# 設定填充顏色
turtle.fillcolor('blue')
# 開始填充
turtle.begin_fill()
# 從原點開始,畫出一個邊長為100的正方形
for i in range(4):
# 正向運動 100 的距離
turtle.forward(200)
# 向右偏 90 度
turtle.right(90)
# 結束填充
turtle.end_fill()
turtle.penup()
turtle.goto(100,-100)
turtle.write('Crossin程式設計教室')
最後的結果是這樣
同時,我們還可以設定畫筆打粗細、畫筆的速度等屬性,
1.3 Window control (視窗控制)
這裡有兩個常用的函式
turtle.bgcolor(*args)
設定背景顏色
turtle.bgpic(picname=None)
背景圖片填充
設定程式碼如下
turtle.bgcolor('red')
turtle.bgpic(r'yourpic.png')
2. 海龜繪圖例項
我們用幾個簡單的例子講解海龜繪圖的用法。
2.1 用正方形畫圓
import turtle
for i in range(360):
turtle.setheading(i)
for i in range(4):
turtle.forward(100)
turtle.left(90)
360 個正方形每隔 1 度排列,短短几行程式碼可以生成一個漂亮規則的圖形。
2.2 紅色的五角星
使用填充功能畫出一個大紅星
import turtle
turtle.color('red','red')
turtle.begin_fill()
for i in range(5):
turtle.forward(100)
turtle.right(144)
turtle.end_fill()
結果如圖:
2.3練習題
講的再多也不如自己動手做一做,我們在網上挑選了幾張使用 turtle 做的有意思的圖片,自己動手試試吧
彩蛋
# coding=utf-8
import turtle
from datetime import *
# 擡起畫筆,向前運動一段距離放下
def Skip(step):
turtle.penup()
turtle.forward(step)
turtle.pendown()
def mkHand(name, length):
# 註冊Turtle形狀,建立錶針Turtle
turtle.reset()
Skip(-length * 0.1)
# 開始記錄多邊形的頂點。當前的烏龜位置是多邊形的第一個頂點。
turtle.begin_poly()
turtle.forward(length * 1.1)
# 停止記錄多邊形的頂點。當前的烏龜位置是多邊形的最後一個頂點。將與第一個頂點相連。
turtle.end_poly()
# 返回最後記錄的多邊形。
handForm = turtle.get_poly()
turtle.register_shape(name, handForm)
def Init():
global secHand, minHand, hurHand, printer
# 重置Turtle指向北
turtle.mode("logo")
# 建立三個錶針Turtle並初始化
mkHand("secHand", 135)
mkHand("minHand", 125)
mkHand("hurHand", 90)
secHand = turtle.Turtle()
secHand.shape("secHand")
minHand = turtle.Turtle()
minHand.shape("minHand")
hurHand = turtle.Turtle()
hurHand.shape("hurHand")
for hand in secHand, minHand, hurHand:
hand.shapesize(1, 1, 3)
hand.speed(0)
# 建立輸出文字Turtle
printer = turtle.Turtle()
# 隱藏畫筆的turtle形狀
printer.hideturtle()
printer.penup()
def SetupClock(radius):
# 建立表的外框
turtle.reset()
turtle.pensize(7)
for i in range(60):
Skip(radius)
if i % 5 == 0:
turtle.forward(20)
Skip(-radius - 20)
Skip(radius + 20)
if i == 0:
turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
elif i == 30:
Skip(25)
turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
Skip(-25)
elif (i == 25 or i == 35):
Skip(20)
turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
Skip(-20)
else:
turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
Skip(-radius - 20)
else:
turtle.dot(5)
Skip(-radius)
turtle.right(6)
def Week(t):
week = ["星期一", "星期二", "星期三",
"星期四", "星期五", "星期六", "星期日"]
return week[t.weekday()]
def Date(t):
y = t.year
m = t.month
d = t.day
return "%s %d%d" % (y, m, d)
def Tick():
# 繪製錶針的動態顯示
t = datetime.today()
second = t.second + t.microsecond * 0.000001
minute = t.minute + second / 60.0
hour = t.hour + minute / 60.0
secHand.setheading(6 * second)
minHand.setheading(6 * minute)
hurHand.setheading(30 * hour)
turtle.tracer(False)
printer.forward(65)
printer.write(Week(t), align="center",
font=("Courier", 14, "bold"))
printer.back(130)
printer.write(Date(t), align="center",
font=("Courier", 14, "bold"))
printer.home()
turtle.tracer(True)
# 100ms後繼續呼叫tick
turtle.ontimer(Tick, 100)
def main():
# 開啟/關閉龜動畫,併為更新圖紙設定延遲。
turtle.tracer(False)
Init()
SetupClock(160)
turtle.tracer(True)
Tick()
turtle.mainloop()
if __name__ == "__main__":
main()