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 用正方形畫圓
importturtlefor i in range(360):
turtle.setheading(i)for i in range(4):
turtle.forward(100)
turtle.left(90)
360 個正方形每隔 1 度排列,短短幾行代碼可以生成一個漂亮規則的圖形。
2.2 紅色的五角星
使用填充功能畫出一個大紅星
importturtle
turtle.color('red','red')
turtle.begin_fill()for i in range(5):
turtle.forward(100)
turtle.right(144)
turtle.end_fill()
結果如圖:
動態時鐘
#coding=utf-8
importturtlefrom datetime import *
#抬起畫筆,向前運動一段距離放下
defSkip(step):
turtle.penup()
turtle.forward(step)
turtle.pendown()defmkHand(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)defInit():globalsecHand, 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 insecHand, minHand, hurHand:
hand.shapesize(1, 1, 3)
hand.speed(0)#建立輸出文字Turtle
printer =turtle.Turtle()#隱藏畫筆的turtle形狀
printer.hideturtle()
printer.penup()defSetupClock(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)defWeek(t):
week= ["星期一", "星期二", "星期三","星期四", "星期五", "星期六", "星期日"]returnweek[t.weekday()]defDate(t):
y=t.year
m=t.month
d=t.dayreturn "%s %d%d" %(y, m, d)defTick():#繪制表針的動態顯示
t =datetime.today()
second= t.second + t.microsecond * 0.000001minute= t.minute + second / 60.0hour= t.hour + minute / 60.0secHand.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)defmain():#打開/關閉龜動畫,并為更新圖紙設置延遲。
turtle.tracer(False)
Init()
SetupClock(160)
turtle.tracer(True)
Tick()
turtle.mainloop()if __name__ == "__main__":
main()
結果是一個動態的時鐘,下圖只是一個截圖