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.pendown()
起筆,在此狀態下不會畫出運動的軌跡
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()
結果如圖:

動態時鍾
# 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()
結果是一個動態的時鍾,下圖只是一個截圖

