Python語言程序設計(3)--實例2-python蟒蛇繪制-turtle庫


1.

 

2.

 

3.了解turtle庫

Turtle,也叫海龜渲染器,使用Turtle庫畫圖也叫海龜作圖。Turtle庫是Python語言中一個很流行的繪制圖像的函數庫。海龜渲染器,和各種三維軟件都有着良好的結合。功能強大,使用方便。該渲染器的特色在於其渲染速度可以優海龜渲染器,

和各種三維軟件都有着良好的結合。功能強大,使用方便。化得非常快,相比起mental ray來說,這是他的一大優點。尤其是在全局光與final gather聯用的時候效果更是明顯。海龜渲染器在渲染大場景時非常有效,其對於光線的處理和色彩的鮮艷程度都要更勝三維軟件自帶的渲染器。其缺點在於對於三維軟件的程序紋理貼圖的支持不夠,很多情況下並不能對它的材質球使用程序紋理貼圖,這不能不說是一個遺憾。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.編寫代碼

#pythondraw.py
import turtle #引用 繪制(海龜)庫 turtle.setup(650,350,200,200) #啟動窗體,寬650,高350 turtle.penup() #抬起畫筆 turtle.fd(-250) #倒退250像素 turtle.pendown() #落下畫筆 turtle.pensize(25) #畫筆寬度是25像素 turtle.pencolor('purple') #畫筆顏色是紫色 turtle.seth(-40) #調整方向為絕對40度 for i in range(4): #循環4次,走曲線,r為40像素,角度為80 turtle.circle(40,80) turtle.circle(-40,80) turtle.circle(40,80/2) #繼續走曲線 turtle.fd(40) #向前走40像素 turtle.circle(16,180) turtle.fd(40 * 2/3) turtle.done() #結束繪制,不會主動退出;如果想繪圖結束就關閉窗口,就去掉這一行

 

 

 

 

 推薦使用:

 

 

 

 畫筆控制函數:

 

 

 

 

turtle.fillcolor(colorstring):繪制圖形的填充顏色

turtle.color(color1, color2):同時設置pencolor=color1, fillcolor=color2

turtle.filling():返回當前是否在填充狀態

turtle.begin_fill():准備開始填充圖形

turtle.end_fill():填充完成

turtle.hideturtle():隱藏畫筆的turtle形狀

turtle.showturtle():顯示畫筆的turtle形狀

運動控制函數:

 

 

 

turtle.forward(distance):向當前畫筆方向移動distance像素長度

turtle.backward(distance):向當前畫筆相反方向移動distance像素長度

turtle.right(degree):順時針移動degree°

turtle.left(degree):逆時針移動degree°

turtle.pendown():移動時繪制圖形,缺省時也為繪制

turtle.goto(x,y):將畫筆移動到坐標為x,y的位置

turtle.penup():提起筆移動,不繪制圖形,用於另起一個地方繪制

turtle.circle():畫圓,半徑為正(負),表示圓心在畫筆的左邊(右邊)畫圓

setx( ):將當前x軸移動到指定位置

sety( ):將當前y軸移動到指定位置

setheading(angle):設置當前朝向為angle角度

home():設置當前畫筆位置為原點,朝向東。

dot(r):繪制一個指定直徑和顏色的圓點

 

方向控制函數:

 

 

 

 

 

循環與range函數:

 

 print里加了逗號,輸出時文字與參數會加一個空格

 

 全局控制命令:

turtle.clear():清空turtle窗口,但是turtle的位置和狀態不會改變

turtle.reset():清空窗口,重置turtle狀態為起始狀態

turtle.undo():撤銷上一個turtle動作

turtle.isvisible():返回當前turtle是否可見

stamp():復制當前圖形

turtle.write(s [,font=("font-name",font_size,"font_type")]):寫文本,s為文本內容,font是字體的參數,分別為字體名稱,大小和類型;font為可選項,font參數也是可選項

 

其他命令:

 

 

網上找的示例:

使用turtle繪制七段數碼管,顯示當前日期

#SevenDigitsDrawV2.py
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(d): #根據數字繪制七段數碼管
    drawLine(True) if d in [2,3,4,5,6,8,9] else drawLine(False)
    drawLine(True) if d in [0,1,3,4,5,6,7,8,9] else drawLine(False)
    drawLine(True) if d in [0,2,3,5,6,8,9] else drawLine(False)
    drawLine(True) if d in [0,2,6,8] else drawLine(False)
    turtle.left(90)
    drawLine(True) if d in [0,4,5,6,8,9] else drawLine(False)
    drawLine(True) if d in [0,2,3,5,6,7,8,9] else drawLine(False)
    drawLine(True) if d in [0,1,2,3,4,7,8,9] else drawLine(False)
    turtle.left(180)
    turtle.penup()
    turtle.fd(20)
def drawDate(date):
    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))
def main():
    turtle.setup(800, 350, 200, 200) #設置畫布窗口大小以及位置
    turtle.penup()
    turtle.fd(-350)
    turtle.pensize(5) 
    t=time.gmtime() #獲取系統當前時間
    drawDate(time.strftime('%Y-%m=%d+',t)
    turtle.hideturtle() 
    turtle.done()
main()

 

 

畫個時鍾:

# 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)
    turtle.pencolor("#ff5500")
    turtle.fillcolor("green")
 
    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()

 

 

 

 繪制小豬佩奇:

 

# coding:utf-8
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.pu()
t.goto(-100,100)
t.pd()
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.lt(3)  # 向左轉3度
        t.fd(a)  # 向前走a的步長
    else:
        a = a-0.08
        t.lt(3)
        t.fd(a)
        t.end_fill()
 
t.pu()
t.seth(90)
t.fd(25)
t.seth(0)
t.fd(10)
t.pd()
t.pencolor(255, 155, 192)
t.seth(10)
t.begin_fill()
t.circle(5)
t.color(160, 82, 45)
t.end_fill()
 
t.pu()
t.seth(0)
t.fd(20)
t.pd()
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.pu()
t.seth(90)
t.fd(41)
t.seth(0)
t.fd(0)
t.pd()
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.pu()
t.goto(-100, 100)
t.pd()
t.seth(-30)
a = 0.4
for i in range(60):
    if 0 <= i < 30 or 60 <= i <90:
        a = a+0.08
        t.lt(3)  # 向左轉3度
        t.fd(a)  # 向前走a的步長
    else:
        a = a-0.08
        t.lt(3)
        t.fd(a)
        t.end_fill()
 
# 耳朵
t.color((255, 155, 192), "pink")
t.pu()
t.seth(90)
t.fd(-7)
t.seth(0)
t.fd(70)
t.pd()
t.begin_fill()
t.seth(100)
t.circle(-50, 50)
t.circle(-10, 120)
t.circle(-50, 54)
t.end_fill()
 
t.pu()
t.seth(90)
t.fd(-12)
t.seth(0)
t.fd(30)
t.pd()
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.pu()
t.seth(90)
t.fd(-20)
t.seth(0)
t.fd(-95)
t.pd()
t.begin_fill()
t.circle(15)
t.end_fill()
 
t.color("black")
t.pu()
t.seth(90)
t.fd(12)
t.seth(0)
t.fd(-3)
t.pd()
t.begin_fill()
t.circle(3)
t.end_fill()
 
t.color((255, 155, 192), "white")
t.pu()
t.seth(90)
t.fd(-25)
t.seth(0)
t.fd(40)
t.pd()
t.begin_fill()
t.circle(15)
t.end_fill()
 
t.color("black")
t.pu()
t.seth(90)
t.fd(12)
t.seth(0)
t.fd(-3)
t.pd()
t.begin_fill()
t.circle(3)
t.end_fill()
 
#
t.color((255, 155, 192))
t.pu()
t.seth(90)
t.fd(-95)
t.seth(0)
t.fd(65)
t.pd()
t.begin_fill()
t.circle(30)
t.end_fill()
 
#
t.color(239, 69, 19)
t.pu()
t.seth(90)
t.fd(15)
t.seth(0)
t.fd(-100)
t.pd()
t.seth(-80)
t.circle(30, 40)
t.circle(40, 80)
 
# 身體
t.color("red", (255, 99, 71))
t.pu()
t.seth(90)
t.fd(-20)
t.seth(0)
t.fd(-78)
t.pd()
t.begin_fill()
t.seth(-130)
t.circle(100,10)
t.circle(300,30)
t.seth(0)
t.fd(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.pu()
t.seth(90)
t.fd(-40)
t.seth(0)
t.fd(-27)
t.pd()
t.seth(-160)
t.circle(300,15)
t.pu()
t.seth(90)
t.fd(15)
t.seth(0)
t.fd(0)
t.pd()
t.seth(-10)
t.circle(-20,90)
 
t.pu()
t.seth(90)
t.fd(30)
t.seth(0)
t.fd(237)
t.pd()
t.seth(-20)
t.circle(-300,15)
t.pu()
t.seth(90)
t.fd(20)
t.seth(0)
t.fd(0)
t.pd()
t.seth(-170)
t.circle(20,90)
 
#
t.pensize(10)
t.color((240,128,128))
t.pu()
t.seth(90)
t.fd(-75)
t.seth(0)
t.fd(-180)
t.pd()
t.seth(-90)
t.fd(40)
t.seth(-180)
t.color("black")
t.pensize(15)
t.fd(20)
 
t.pensize(10)
t.color((240, 128, 128))
t.pu()
t.seth(90)
t.fd(40)
t.seth(0)
t.fd(90)
t.pd()
t.seth(-90)
t.fd(40)
t.seth(-180)
t.color("black")
t.pensize(15)
t.fd(20)
 
# 尾巴
t.pensize(4)
t.color((255, 155, 192))
t.pu()
t.seth(90)
t.fd(70)
t.seth(0)
t.fd(95)
t.pd()
t.seth(0)
t.circle(70, 20)
t.circle(10, 330)
t.circle(70, 30)
t.done()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM