python之turtle海龜繪圖篇

海龜繪圖

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章