海龜繪圖
python2.6版本中後引入的一個簡單的繪圖工具,叫做海龜繪圖(Turtle Graphics),出現在1966年的Logo計算機語言。
海龜繪圖(turtle庫)是python的內部模塊,使用前導入即可 import turtle
海龜有3個關鍵屬性:方向、位置和畫筆(筆的屬性有色彩、寬度和開/關狀態)
1. 畫布(canvas)
畫布就是turtle爲我們展開用於繪圖區域, 我們可以設置它的大小和初始位置
設置畫布大小:
turtle.screensize(canvwidth=None, canvheight=None, bg=None)
參數分別爲畫布的寬(單位像素), 高, 背景顏色
如:
turtle.screensize(800, 600, “green”)
turtle.screensize() #返回默認大小(400, 300)
turtle.setup(width=0.5, height=0.75, startx=None, starty=None)
setup()設置窗體大小及位置,參數:
width, height: 輸入寬和高爲整數時, 表示像素; 爲小數時, 表示佔據電腦屏幕的比例
(startx, starty): 這一座標表示 矩形窗口左上角頂點的位置, 如果爲空,則窗口位於屏幕中心
如:
turtle.setup(width=0.6, height=0.6)
turtle.setup(width=800, height=800, startx=100, starty=100)
2. 畫筆
使用Pen()設定海龜畫圖對象,即畫筆:turtle.Pen()
代碼執行後就建立了畫布,同時屏幕中間可以看見箭頭(arrow),即所謂的海龜
在海龜繪圖中,海龜的起點即畫布中央爲 (0,0),移動單位是像素 (pixel)
描述海龜時使用了兩個詞語:座標原點(位置),面朝x軸正方向(方向), turtle繪圖中, 就是使用位置方向描述海龜(畫筆)的狀態
3.繪圖命令
操縱海龜繪圖有着許多的命令,這些命令可以劃分爲3種
- 畫筆運動命令
- 畫筆控制命令
- 全局控制命令
部分命令詳解:
turtle.circle(radius, extent=None, steps=None)
描述: 以給定半徑畫圓
參數:
radius(半徑):半徑爲正(負),表示圓心在畫筆的左邊(右邊)畫圓
extent(弧度) (optional)
steps (optional) (做半徑爲radius的圓的內切正多邊形,多邊形邊數爲steps)
turtle.setheading(angle) 別名:turtle.seth(angle) 改變行進方向,angle指行進方向的絕對角度,只改變方向但不行進
turtle.goto(x,y): 空間座標體系(絕對座標)
turtle.done(): 用來停止畫筆繪製,但繪圖窗體不關閉
4.繪圖舉例
繪製正方形:每輸入一條指令,都可以看到海龜前進繪圖和轉向
繪製太陽花:
繪製趣圖:
繪製五角星:
繪製小蟒蛇:
繪製科赫曲線及科赫雪花:
#繪製科赫雪花
import turtle
def koch(size,n):
if n == 0:
turtle.fd(size)
else:
for angle in [0,60,-120,60]:
turtle.left(angle)
koch(size/3,n-1)
def main():
turtle.setup(600,600)
turtle.penup()
turtle.goto(-200,100)
turtle.pendown()
turtle.pensize(2)
level = 3 #3階科赫雪花,階數
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.right(120)
koch(400,level)
turtle.hideturtle()
turtle.done()
main()
繪製七段數碼管:
完整代碼:
#繪製七段數碼管
import turtle,time
def drawGap(): #繪製數碼管間隔
turtle.penup()
turtle.fd(5)
def drawLine(draw): #繪製單段數碼管
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawGap()
turtle.right(90)
def drawDigit(digit): #根據數字繪製七段數碼管
drawLine(True) if digit in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if digit in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if digit in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup() #爲繪製後續數字確定位置
turtle.fd(20)
def drawData(date): #date爲日期,格式爲 '%Y-%m=%d+'
turtle.pencolor("red")
for i in date:
if i == '-':
turtle.write('年',font=("Arial",18,"normal"))
turtle.pencolor("green")
turtle.fd(40)
elif i == '=':
turtle.write('月',font=("Arial",18,"normal"))
turtle.pencolor("blue")
turtle.fd(40)
elif i == '+':
turtle.write('日',font=("Arial",18,"normal"))
else:
drawDigit(eval(i)) #通過eval()函數將數字變成整數
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.fd(-300)
turtle.pensize(5)
drawData(time.strftime('%Y-%m=%d+',time.gmtime()))
turtle.hideturtle() #隱藏海龜畫筆
turtle.done()
main()
繪製小豬佩奇:
# @author: yang.bin
import turtle as t
# 繪製小豬佩奇
# =======================================
t.pensize(4)
t.hideturtle()
t.colormode(255)
t.color((255, 155, 192), "pink")
t.setup(840, 500)
t.speed(10)
# 鼻子
t.penup()
t.goto(-100,100)
t.pendown()
t.seth(-30)
t.begin_fill()
a = 0.4
for i in range(120):
if 0 <= i < 30 or 60 <= i < 90:
a = a+0.08
t.left(3) # 向左轉3度
t.forward(a) # 向前走a的步長
else:
a = a-0.08
t.left(3)
t.forward(a)
t.end_fill()
t.penup()
t.seth(90)
t.forward(25)
t.seth(0)
t.forward(10)
t.pendown()
t.pencolor(255, 155, 192)
t.seth(10)
t.begin_fill()
t.circle(5)
t.color(160, 82, 45)
t.end_fill()
t.penup()
t.seth(0)
t.forward(20)
t.pendown()
t.pencolor(255, 155, 192)
t.seth(10)
t.begin_fill()
t.circle(5)
t.color(160, 82, 45)
t.end_fill()
# 頭
t.color((255, 155, 192), "pink")
t.penup()
t.seth(90)
t.forward(41)
t.seth(0)
t.forward(0)
t.pendown()
t.begin_fill()
t.seth(180)
t.circle(300, -30)
t.circle(100, -60)
t.circle(80, -100)
t.circle(150, -20)
t.circle(60, -95)
t.seth(161)
t.circle(-300, 15)
t.penup()
t.goto(-100, 100)
t.pendown()
t.seth(-30)
a = 0.4
for i in range(60):
if 0 <= i < 30 or 60 <= i <90:
a = a+0.08
t.left(3) # 向左轉3度
t.forward(a) # 向前走a的步長
else:
a = a-0.08
t.left(3)
t.forward(a)
t.end_fill()
# 耳朵
t.color((255, 155, 192), "pink")
t.penup()
t.seth(90)
t.forward(-7)
t.seth(0)
t.forward(70)
t.pendown()
t.begin_fill()
t.seth(100)
t.circle(-50, 50)
t.circle(-10, 120)
t.circle(-50, 54)
t.end_fill()
t.penup()
t.seth(90)
t.forward(-12)
t.seth(0)
t.forward(30)
t.pendown()
t.begin_fill()
t.seth(100)
t.circle(-50, 50)
t.circle(-10, 120)
t.circle(-50, 56)
t.end_fill()
#眼睛
t.color((255, 155, 192), "white")
t.penup()
t.seth(90)
t.forward(-20)
t.seth(0)
t.forward(-95)
t.pendown()
t.begin_fill()
t.circle(15)
t.end_fill()
t.color("black")
t.penup()
t.seth(90)
t.forward(12)
t.seth(0)
t.forward(-3)
t.pendown()
t.begin_fill()
t.circle(3)
t.end_fill()
t.color((255, 155, 192), "white")
t.penup()
t.seth(90)
t.forward(-25)
t.seth(0)
t.forward(40)
t.pendown()
t.begin_fill()
t.circle(15)
t.end_fill()
t.color("black")
t.penup()
t.seth(90)
t.forward(12)
t.seth(0)
t.forward(-3)
t.pendown()
t.begin_fill()
t.circle(3)
t.end_fill()
# 腮
t.color((255, 155, 192))
t.penup()
t.seth(90)
t.forward(-95)
t.seth(0)
t.forward(65)
t.pendown()
t.begin_fill()
t.circle(30)
t.end_fill()
# 嘴
t.color(239, 69, 19)
t.penup()
t.seth(90)
t.forward(15)
t.seth(0)
t.forward(-100)
t.pendown()
t.seth(-80)
t.circle(30, 40)
t.circle(40, 80)
# 身體
t.color("red", (255, 99, 71))
t.penup()
t.seth(90)
t.forward(-20)
t.seth(0)
t.forward(-78)
t.pendown()
t.begin_fill()
t.seth(-130)
t.circle(100,10)
t.circle(300,30)
t.seth(0)
t.forward(230)
t.seth(90)
t.circle(300,30)
t.circle(100,3)
t.color((255,155,192),(255,100,100))
t.seth(-135)
t.circle(-80,63)
t.circle(-150,24)
t.end_fill()
# 手
t.color((255,155,192))
t.penup()
t.seth(90)
t.forward(-40)
t.seth(0)
t.forward(-27)
t.pendown()
t.seth(-160)
t.circle(300,15)
t.penup()
t.seth(90)
t.forward(15)
t.seth(0)
t.forward(0)
t.pendown()
t.seth(-10)
t.circle(-20,90)
t.penup()
t.seth(90)
t.forward(30)
t.seth(0)
t.forward(237)
t.pendown()
t.seth(-20)
t.circle(-300,15)
t.penup()
t.seth(90)
t.forward(20)
t.seth(0)
t.forward(0)
t.pendown()
t.seth(-170)
t.circle(20,90)
# 腳
t.pensize(10)
t.color((240,128,128))
t.penup()
t.seth(90)
t.forward(-75)
t.seth(0)
t.forward(-180)
t.pendown()
t.seth(-90)
t.forward(40)
t.seth(-180)
t.color("black")
t.pensize(15)
t.forward(20)
t.pensize(10)
t.color((240, 128, 128))
t.penup()
t.seth(90)
t.forward(40)
t.seth(0)
t.forward(90)
t.pendown()
t.seth(-90)
t.forward(40)
t.seth(-180)
t.color("black")
t.pensize(15)
t.forward(20)
# 尾巴
t.pensize(4)
t.color((255, 155, 192))
t.penup()
t.seth(90)
t.forward(70)
t.seth(0)
t.forward(95)
t.pendown()
t.seth(0)
t.circle(70, 20)
t.circle(10, 330)
t.circle(70, 30)
t.done()