zoukankan      html  css  js  c++  java
  • Python 【绘制图及turtle库的使用】

    前言

    • 最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,整理了一下,挑了一些觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~赶快去试一下吧)

    one 樱花树

    动态生成樱花

    • 效果图(这个是动态的):

    • 实现代码:
    import turtle as T
    import random
    import time
    
    # 画樱花的躯干(60,t)
    def Tree(branch, t):
    time.sleep(0.0005)
    if branch > 3:
    if 8 <= branch <= 12:
    if random.randint(0, 2) == 0:
    t.color('snow') #
    else:
    t.color('lightcoral') # 淡珊瑚色
    t.pensize(branch / 3)
    elif branch < 8:
    if random.randint(0, 1) == 0:
    t.color('snow')
    else:
    t.color('lightcoral') # 淡珊瑚色
    t.pensize(branch / 2)
    else:
    t.color('sienna') # 赭(zhě)色
    t.pensize(branch / 10) # 6
    t.forward(branch)
    a = 1.5 * random.random()
    t.right(20 * a)
    b = 1.5 * random.random()
    Tree(branch - 10 * b, t)
    t.left(40 * a)
    Tree(branch - 10 * b, t)
    t.right(20 * a)
    t.up()
    t.backward(branch)
    t.down()
    
    # 掉落的花瓣
    def Petal(m, t):
    for i in range(m):
    a = 200 - 400 * random.random()
    b = 10 - 20 * random.random()
    t.up()
    t.forward(b)
    t.left(90)
    t.forward(a)
    t.down()
    t.color('lightcoral') # 淡珊瑚色
    t.circle(1)
    t.up()
    t.backward(a)
    t.right(90)
    t.backward(b)
    
    # 绘图区域
    t = T.Turtle()
    # 画布大小
    w = T.Screen()
    t.hideturtle() # 隐藏画笔
    t.getscreen().tracer(5, 0)
    w.screensize(bg='wheat') # wheat小麦
    t.left(90)
    t.up()
    t.backward(150)
    t.down()
    t.color('sienna')
    
    # 画樱花的躯干
    Tree(60, t)
    # 掉落的花瓣
    Petal(200, t)
    w.exitonclick()

    飘落效果

    • 效果图:

    • 实现代码:
    from turtle import *
    from random import *
    from math import *
    
    def tree(n,l):
    pd()#下笔
    #阴影效果
    t = cos(radians(heading()+45))/8+0.25
    pencolor(t,t,t)
    pensize(n/3)
    forward(l)#画树枝
    
    if n>0:
    b = random()*15+10 #右分支偏转角度
    c = random()*15+10 #左分支偏转角度
    d = l*(random()*0.25+0.7) #下一个分支的长度
    #右转一定角度,画右分支
    right(b)
    tree(n-1,d)
    #左转一定角度,画左分支
    left(b+c)
    tree(n-1,d)
    #转回来
    right(c)
    else:
    #画叶子
    right(90)
    n=cos(radians(heading()-45))/4+0.5
    pencolor(n,n*0.8,n*0.8)
    circle(3)
    left(90)
    #添加0.3倍的飘落叶子
    if(random()>0.7):
    pu()
    #飘落
    t = heading()
    an = -40 +random()*40
    setheading(an)
    dis = int(800*random()*0.5 + 400*random()*0.3 + 200*random()*0.2)
    forward(dis)
    setheading(t)
    #画叶子
    pd()
    right(90)
    n = cos(radians(heading()-45))/4+0.5
    pencolor(n*0.5+0.5,0.4+n*0.4,0.4+n*0.4)
    circle(2)
    left(90)
    pu()
    #返回
    t=heading()
    setheading(an)
    backward(dis)
    setheading(t)
    pu()
    backward(l)#退回
    
    bgcolor(0.5,0.5,0.5)#背景色
    ht()#隐藏turtle
    speed(0)#速度 1-10渐进,0 最快
    tracer(0,0)
    pu()#抬笔
    backward(100)
    left(90)#左转90度
    pu()#抬笔
    backward(300)#后退300
    tree(12,100)#递归7层
    done()

    暗色效果

    • 效果图:

    • 实现代码:
    from turtle import *
    from random import *
    from math import *
    
    def tree(n, l):
    pd()
    t = cos(radians(heading() + 45)) / 8 + 0.25
    pencolor(t, t, t)
    pensize(n / 4)
    forward(l)
    if n > 0:
    b = random() * 15 + 10
    c = random() * 15 + 10
    d = l * (random() * 0.35 + 0.6)
    right(b)
    tree(n - 1, d)
    left(b + c)
    tree(n - 1, d)
    right(c)
    else:
    right(90)
    n = cos(radians(heading() - 45)) / 4 + 0.5
    pencolor(n, n, n)
    circle(2)
    left(90)
    pu()
    backward(l)
    bgcolor(0.5, 0.5, 0.5)
    ht()
    speed(0)
    tracer(0, 0)
    left(90)
    pu()
    backward(300)
    tree(13, 100)
    done()

    two 玫瑰花

    • 效果图(有绘制过程)

    • 实现代码:
    from turtle import *
    import time
    
    setup(1000,800,0,0)
    speed(0)
    penup()
    seth(90)
    fd(340)
    seth(0)
    pendown()
    
    speed(5)
    begin_fill()
    fillcolor('red')
    circle(50,30)
    
    for i in range(10):
    fd(1)
    left(10)
    
    circle(40,40)
    
    for i in range(6):
    fd(1)
    left(3)
    
    circle(80,40)
    
    for i in range(20):
    fd(0.5)
    left(5)
    
    circle(80,45)
    
    for i in range(10):
    fd(2)
    left(1)
    
    circle(80,25)
    
    for i in range(20):
    fd(1)
    left(4)
    
    circle(50,50)
    
    time.sleep(0.1)
    
    circle(120,55)
    
    speed(0)
    
    seth(-90)
    fd(70)
    
    right(150)
    fd(20)
    
    left(140)
    circle(140,90)
    
    left(30)
    circle(160,100)
    
    left(130)
    fd(25)
    
    penup()
    right(150)
    circle(40,80)
    pendown()
    
    left(115)
    fd(60)
    
    penup()
    left(180)
    fd(60)
    pendown()
    
    end_fill()
    
    right(120)
    circle(-50,50)
    circle(-20,90)
    
    speed(1)
    fd(75)
    
    speed(0)
    circle(90,110)
    
    penup()
    left(162)
    fd(185)
    left(170)
    pendown()
    circle(200,10)
    circle(100,40)
    circle(-52,115)
    left(20)
    circle(100,20)
    circle(300,20)
    speed(1)
    fd(250)
    
    penup()
    speed(0)
    left(180)
    fd(250)
    circle(-300,7)
    right(80)
    circle(200,5)
    pendown()
    
    left(60)
    begin_fill()
    fillcolor('green')
    circle(-80,100)
    right(90)
    fd(10)
    left(20)
    circle(-63,127)
    end_fill()
    
    penup()
    left(50)
    fd(20)
    left(180)
    
    pendown()
    circle(200,25)
    
    penup()
    right(150)
    
    fd(180)
    
    right(40)
    pendown()
    begin_fill()
    fillcolor('green')
    circle(-100,80)
    right(150)
    fd(10)
    left(60)
    circle(-80,98)
    end_fill()
    
    penup()
    left(60)
    fd(13)
    left(180)
    
    pendown()
    speed(1)
    circle(-200,23)
    
    exitonclick()

    three 圣诞树

    • 圣诞树 (动态生成效果图)

    • 实现代码:
    from turtle import *
    import random
    import time
    
    n = 100.0
    
    speed("fastest")
    screensize(bg='seashell')
    left(90)
    forward(3*n)
    color("orange", "yellow")
    begin_fill()
    left(126)
    
    for i in range(5):
    forward(n/5)
    right(144)
    forward(n/5)
    left(72)
    end_fill()
    right(126)
    
    color("dark green")
    backward(n*4.8)
    def tree(d, s):
    if d <= 0: return
    forward(s)
    tree(d-1, s*.8)
    right(120)
    tree(d-3, s*.5)
    right(120)
    tree(d-3, s*.5)
    right(120)
    backward(s)
    tree(15, n)
    backward(n/2)
    
    for i in range(200):
    a = 200 - 400 * random.random()
    b = 10 - 20 * random.random()
    up()
    forward(b)
    left(90)
    forward(a)
    down()
    if random.randint(0, 1) == 0:
    color('tomato')
    else:
    color('wheat')
    circle(2)
    up()
    backward(a)
    right(90)
    backward(b)
    
    time.sleep(60)

    turtle绘制动漫形象

    • 成品图:

    • 绘制过程: 

     

    • 实现代码: 
    import turtle as te
    import time
    WriteStep = 15  # 贝塞尔函数的取样次数
    Speed = 5
    Width = 600  # 界面宽度
    Height = 500  # 界面高度
    Xh = 0  # 记录前一个贝塞尔函数的手柄
    Yh = 0
    
    def Bezier(p1, p2, t):  # 一阶贝塞尔函数
        return p1 * (1 - t) + p2 * t
    
    def Bezier_2(x1, y1, x2, y2, x3, y3):  # 二阶贝塞尔函数
        te.goto(x1, y1)
        te.pendown()
        for t in range(0, WriteStep + 1):
            x = Bezier(Bezier(x1, x2, t / WriteStep),
                       Bezier(x2, x3, t / WriteStep), t / WriteStep)
            y = Bezier(Bezier(y1, y2, t / WriteStep),
                       Bezier(y2, y3, t / WriteStep), t / WriteStep)
            te.goto(x, y)
        te.penup()
    
    def Bezier_3(x1, y1, x2, y2, x3, y3, x4, y4):  # 三阶贝塞尔函数
        x1 = -Width / 2 + x1
        y1 = Height / 2 - y1
        x2 = -Width / 2 + x2
        y2 = Height / 2 - y2
        x3 = -Width / 2 + x3
        y3 = Height / 2 - y3
        x4 = -Width / 2 + x4
        y4 = Height / 2 - y4  # 坐标变换
        te.goto(x1, y1)
        te.pendown()
        for t in range(0, WriteStep + 1):
            x = Bezier(Bezier(Bezier(x1, x2, t / WriteStep), Bezier(x2, x3, t / WriteStep), t / WriteStep),
                       Bezier(Bezier(x2, x3, t / WriteStep), Bezier(x3, x4, t / WriteStep), t / WriteStep), t / WriteStep)
            y = Bezier(Bezier(Bezier(y1, y2, t / WriteStep), Bezier(y2, y3, t / WriteStep), t / WriteStep),
                       Bezier(Bezier(y2, y3, t / WriteStep), Bezier(y3, y4, t / WriteStep), t / WriteStep), t / WriteStep)
            te.goto(x, y)
        te.penup()
    
    def Moveto(x, y):  # 移动到svg坐标下(x,y)
        te.penup()
        te.goto(-Width / 2 + x, Height / 2 - y)
    
    
    def line(x1, y1, x2, y2):  # 连接svg坐标下两点
        te.penup()
        te.goto(-Width / 2 + x1, Height / 2 - y1)
        te.pendown()
        te.goto(-Width / 2 + x2, Height / 2 - y2)
        te.penup()
    
    def lineto(dx, dy):  # 连接当前点和相对坐标(dx,dy)的点
        te.pendown()
        te.goto(te.xcor() + dx, te.ycor() - dy)
        te.penup()
    
    def Lineto(x, y):  # 连接当前点和svg坐标下(x,y)
        te.pendown()
        te.goto(-Width / 2 + x, Height / 2 - y)
        te.penup()
    
    def Horizontal(x):  # 做到svg坐标下横坐标为x的水平线
        te.pendown()
        te.setx(x - Width / 2)
        te.penup()
    
    def horizontal(dx):  # 做到相对横坐标为dx的水平线
        te.seth(0)
        te.pendown()
        te.fd(dx)
        te.penup()
    
    def vertical(dy):  # 做到相对纵坐标为dy的垂直线
        te.seth(-90)
        te.pendown()
        te.fd(dy)
        te.penup()
        te.seth(0)
    
    def polyline(x1, y1, x2, y2, x3, y3):  # 做svg坐标下的折线
        te.penup()
        te.goto(-Width / 2 + x1, Height / 2 - y1)
        te.pendown()
        te.goto(-Width / 2 + x2, Height / 2 - y2)
        te.goto(-Width / 2 + x3, Height / 2 - y3)
        te.penup()
    
    def Curveto(x1, y1, x2, y2, x, y):  # 三阶贝塞尔曲线到(x,y)
        te.penup()
        X_now = te.xcor() + Width / 2
        Y_now = Height / 2 - te.ycor()
        Bezier_3(X_now, Y_now, x1, y1, x2, y2, x, y)
        global Xh
        global Yh
        Xh = x - x2
        Yh = y - y2
    
    def curveto_r(x1, y1, x2, y2, x, y):  # 三阶贝塞尔曲线到相对坐标(x,y)
        te.penup()
        X_now = te.xcor() + Width / 2
        Y_now = Height / 2 - te.ycor()
        Bezier_3(X_now, Y_now, X_now + x1, Y_now + y1,
                 X_now + x2, Y_now + y2, X_now + x, Y_now + y)
        global Xh
        global Yh
        Xh = x - x2
        Yh = y - y2
    
    def Smooth(x2, y2, x, y):  # 平滑三阶贝塞尔曲线到(x,y)
        global Xh
        global Yh
        te.penup()
        X_now = te.xcor() + Width / 2
        Y_now = Height / 2 - te.ycor()
        Bezier_3(X_now, Y_now, X_now + Xh, Y_now + Yh, x2, y2, x, y)
        Xh = x - x2
        Yh = y - y2
    
    def smooth_r(x2, y2, x, y):  # 平滑三阶贝塞尔曲线到相对坐标(x,y)
        global Xh
        global Yh
        te.penup()
        X_now = te.xcor() + Width / 2
        Y_now = Height / 2 - te.ycor()
        Bezier_3(X_now, Y_now, X_now + Xh, Y_now + Yh,
                 X_now + x2, Y_now + y2, X_now + x, Y_now + y)
        Xh = x - x2
        Yh = y - y2
    
    te.tracer(10)
    te.setup(Width, Height, 0, 0)
    te.pensize(1)
    te.speed(Speed)
    te.penup()
    
    # 图层_2
    time.sleep(20)
    te.color("black", "#F2F2F2")  # 外套
    Moveto(61, 462)
    te.begin_fill()
    smooth_r(12, -41, 27, -58)
    curveto_r(-6, -36, 6, -118, 9, -132)
    curveto_r(-15, -27, -23, -51, -26, -74)
    curveto_r(4, -66, 38, -105, 65, -149)
    Horizontal(486)
    curveto_r(12, 24, 40, 99, 33, 114)
    curveto_r(39, 82, 55, 129, 39, 144)
    smooth_r(-31, 23, -39, 28)
    smooth_r(-12, 37, -12, 37)
    lineto(50, 92)
    Horizontal(445)
    smooth_r(-29, -38, -31, -46)
    smooth_r(78, -107, 72, -119)
    Smooth(355, 178, 340, 176)
    Smooth(272, 63, 264, 64)
    smooth_r(-29, 67, -27, 73)
    Curveto(99, 292, 174, 428, 173, 439)
    smooth_r(-8, 23, -8, 23)
    Lineto(61, 462)
    te.end_fill()
    
    Moveto(60.5, 461.5)  # 阴影
    te.color("black", "#D3DFF0")
    te.begin_fill()
    curveto_r(0, 0, 17, -42, 27, -59)
    curveto_r(-6, -33, 6, -128, 10, -133)
    curveto_r(-15, -10, -27, -66, -27.285, -75)
    te.pencolor("#D3DFF0")
    curveto_r(12.285, 11, 82.963, 156, 82.963, 156)
    te.pencolor("black")
    smooth_r(12.322, 75, 19.322, 86)
    curveto_r(-1, 11, -8, 25, -8, 25)
    Horizontal(60.5)
    te.end_fill()
    
    Moveto(444.5, 464)
    te.begin_fill()
    curveto_r(0, 0, -29, -36, -31, -46)
    smooth_r(53.59, -82.337, 53.59, -82.337)
    te.pencolor("#D3DFF0")
    smooth_r(86.41, -47.663, 96.072, -54.85)
    Curveto(563.5, 297.5, 570.5, 299.5, 518.5, 334)
    te.pencolor("black")
    curveto_r(-2, 16, -12, 33, -12, 37)
    smooth_r(50, 92, 50, 93)
    Horizontal(444.5)
    te.end_fill()
    
    Moveto(195, 49)
    te.begin_fill()
    te.pencolor("#D3DFF0")
    polyline(195, 49, 175.5, 106.5, 202.522, 49)
    te.pencolor("black")
    Horizontal(195)
    te.pencolor("#D3DFF0")
    te.end_fill()
    
    Moveto(327.997, 49)
    te.begin_fill()
    te.pencolor("#D3DFF0")
    curveto_r(0, 0, 11.503, 121.087, 13.503, 128.087)
    curveto_r(11, 2, 54, 37, 54, 37)
    lineto(-40, -165.087)
    te.pencolor("black")
    Horizontal(327.997)
    te.pencolor("#D3DFF0")
    te.end_fill()
    
    te.pencolor("black")
    line(94.5, 397.5, 107.5, 373.5)  # 皱纹
    line(122.5, 317.5, 95.875, 274.699)
    line(122.5, 341.5, 141.5, 402.5)
    line(141.5, 409.5, 153.5, 431.5)
    # line(328,47.712,344,175.977)
    line(340.023, 49, 360.5, 144)
    # line(353.5,47.5,395.5,208.5)
    line(478.5, 95.5, 518.5, 161.5)
    line(518.5, 332.5, 460.5, 359.5)
    polyline(506.5, 369.5, 493.5, 402.5, 502.5, 443.5)
    Moveto(530, 429)
    curveto_r(4, 16, -5, 33, -5, 33)
    
    # 图层_3
    te.color("black", "#2b1d2a")  # 外套内侧
    Moveto(225, 462)
    te.begin_fill()
    Horizontal(165)
    smooth_r(9, -15, 8, -25)
    curveto_r(-47, -126, 6, -212, 12, -225)
    Curveto(185, 305, 202, 428, 225, 462)
    Lineto(225, 462)
    te.end_fill()
    
    Moveto(390, 462)
    te.begin_fill()
    curveto_r(10, -23, 34, -180, 35, -222)  # !!!227
    curveto_r(7, 4, 54, 45, 61, 61)  # 61
    smooth_r(-73, 101, -72, 118)
    curveto_r(5, 15, 31, 46, 31, 45)
    Lineto(390, 462)
    te.end_fill()
    # 图层_4
    te.color("black", "#2b1d29")  # 外套内侧
    Moveto(225, 462)
    te.begin_fill()
    curveto_r(-28, -50, -40, -166, -40, -250)
    curveto_r(6, 51, -6, 87, 45, 106)
    smooth_r(64, 27, 89, 24)
    smooth_r(49, -18, 56, -20)
    smooth_r(50, -10, 51, -85)
    curveto_r(0, 29, -25, 201, -36, 225)
    Lineto(225, 462)
    te.end_fill()
    # 图层_5
    te.color("black", "#3D3D3D")  # 衣服
    Moveto(225, 462)
    te.begin_fill()
    curveto_r(-5, -5, -22, -53, -23, -70)
    lineto(32, -13)
    curveto_r(3, -25, 6, -28, 12, -36)
    smooth_r(13, -12, 16, -12)
    vertical(-2)
    curveto_r(45, 20, 64, 14, 94, 1)
    vertical(2)
    curveto_r(8, -2, 15, 2, 17, 4)
    smooth_r(0, 6, -2, 9)
    curveto_r(10, 10, 10, 29, 11, 33)
    smooth_r(23, 4, 25, 6)
    smooth_r(-17, 83, -17, 78)
    Lineto(225, 462)
    te.end_fill()
    # 图层_6
    te.color("black", "#968281")  # 脖子
    Moveto(262, 329)
    te.begin_fill()
    vertical(17)
    curveto_r(1, 2, 44, 14, 45, 15)
    smooth_r(3, 12, 3, 12)
    horizontal(3)
    vertical(-5)
    curveto_r(1, -3, 4, -6, 5, -7)
    lineto(36, -14)
    curveto_r(1, -1, 3, -16, 2, -17)
    Curveto(318, 348, 296, 344, 262, 329)
    te.end_fill()
    # 图层_8
    te.color("black", "#E7F1FF")  # 白色褶皱
    Moveto(225, 462)
    te.begin_fill()
    lineto(-3, -5)  # -3,-3,-3,-5
    curveto_r(0, -2, 4, -4, 5, -6)
    smooth_r(16, 3, 19, -8)
    smooth_r(0, -7, 0, -11)
    smooth_r(5, -8, 9, -5)
    smooth_r(19, -8, 19, -11)
    smooth_r(6, -7, 6, -7)
    smooth_r(7, -2, 9, -4)
    lineto(41, -2)
    lineto(12, 9)
    smooth_r(3, 15, 7, 18)
    smooth_r(15, 4, 17, 4)
    smooth_r(4, -4, 6, -4)
    smooth_r(6, 4, 5, 9)
    smooth_r(0, 9, 0, 9)
    smooth_r(1, 7, 7, 6)
    smooth_r(8, 0, 8, 0)
    lineto(-2, 8)
    Lineto(225, 462)
    te.end_fill()
    
    te.pensize(2)
    Moveto(240, 450)
    smooth_r(0, 9, 3, 12)
    Moveto(372, 462)
    curveto_r(-2, -4, -5, -29, -7, -28)
    te.pensize(1)
    # 图层_7
    te.color("black", "#A2B8D6")  # 衣领
    Moveto(262, 331)
    te.begin_fill()
    curveto_r(0, 8, -1, 13, 0, 15)
    smooth_r(43, 14, 45, 15)
    lineto(3, 12)
    horizontal(3)
    smooth_r(-1, -3, 0, -5)
    lineto(5, -7)
    lineto(36, -14)
    curveto_r(1, -1, 2, -12, 2, -15)
    smooth_r(25, -2, 15, 13)
    curveto_r(-2, 4, -7, 29, -7, 32)
    smooth_r(-35, 19, -41, 22)
    smooth_r(-9, 14, -12, 14)
    smooth_r(-7, -12, -14, -15)
    curveto_r(-19, -2, -41, -25, -41, -25)
    smooth_r(-10, -26, -10, -30)
    Smooth(255, 332, 262, 331)
    te.end_fill()
    
    Moveto(262, 346)
    lineto(-12, -6)
    Moveto(369, 333)
    curveto_r(2, 4, -6, 10, -15, 14)
    # 图层_9
    te.color("black", "#151515")  # 领结
    Moveto(247, 358)
    te.begin_fill()
    curveto_r(-5, 3, -8, 20, -6, 23)
    curveto_r(25, 21, 50, 17, 50, 17)
    lineto(-23, 64)
    horizontal(22)
    smooth_r(1, -13, 2, -16)
    lineto(13, -50)
    curveto_r(2, 2, 7, 3, 10, 1)
    smooth_r(18, 65, 18, 65)
    horizontal(19)
    lineto(-24, -65)
    curveto_r(21, 5, 39, -10, 44, -13)
    curveto_r(5, -20, 1, -21, 0, -24)
    curveto_r(-18, -2, -49, 15, -52, 17)
    smooth_r(-11, -3, -15, -1)
    Smooth(252, 356, 247, 358)
    te.end_fill()
    # 图层_10
    te.color("black", "#A2B8D6")  # 衣领(透过领结)
    Moveto(297, 387)
    te.begin_fill()
    lineto(-11, 6)
    curveto_r(-1, 0, -20, -7, -30, -19)
    Curveto(259, 373, 297, 385, 297, 387)
    te.end_fill()
    
    Moveto(323, 384)
    te.begin_fill()
    lineto(8, 7)
    lineto(30, -14)
    curveto_r(1, -1, 5, -6, 4, -7)
    Smooth(329, 379, 323, 384)
    te.end_fill()
    # 图层_11
    te.color("black", "#F3EEEB")  #
    Moveto(185, 212)
    te.begin_fill()
    curveto_r(4, -9, 46, -77, 52, -75)
    curveto_r(-2, -17, 19, -68, 27, -73)
    curveto_r(16, 15, 71, 108, 76, 112)
    smooth_r(76, 53, 86, 60)
    curveto_r(0, 65, -27, 75, -31, 76)
    curveto_r(-50, 28, -70, 30, -85, 30)
    smooth_r(-77, -22, -86, -26)
    Curveto(180, 302, 186, 228, 185, 212)
    te.end_fill()
    # 图层_12
    te.color("black", "#2B1D29")  # 头发
    Moveto(189, 202)
    te.begin_fill()
    curveto_r(-1, 22, 19, 51, 19, 51)
    smooth_r(-10, -42, 7, -92)
    Curveto(212, 168, 196, 189, 189, 202)
    te.end_fill()
    
    Moveto(221, 155)
    te.begin_fill()
    curveto_r(-2, 6, 5, 48, 5, 48)
    smooth_r(18, -28, 20, -48)
    curveto_r(-5, 24, 4, 43, 7, 50)
    curveto_r(-10, -49, 3, -72, 13, -106)
    curveto_r(-2, -7, -3, -32, -3, -35)
    curveto_r(-17, 18, -27, 71, -27, 71)
    Lineto(221, 155)
    te.end_fill()
    
    Moveto(264, 64)
    te.begin_fill()
    curveto_r(-4, 5, 14, 100, 14, 100)
    smooth_r(-6, -79, -5, -85)
    curveto_r(0, 98, 49, 139, 49, 139)
    smooth_r(8, -50, 3, -65)
    Smooth(272, 64, 264, 64)
    te.end_fill()
    
    Moveto(342, 176)
    te.begin_fill()
    curveto_r(-1, 27, -10, 57, -10, 57)
    smooth_r(20, -33, 17, -54)
    Lineto(342, 176)
    te.end_fill()
    
    te.penup()
    te.begin_fill()
    polyline(349, 180, 353, 203, 361, 203)
    polyline(361, 203, 362, 188, 349, 180)
    te.end_fill()
    # 图层_13
    te.pensize(2)
    Moveto(210, 180)  # 眉毛
    curveto_r(5, -4, 63, 9, 63, 14)
    Moveto(338, 193)
    curveto_r(0, -3, 18, -6, 18, -6)
    te.pensize(1)
    # 图层_14
    te.color("black", "#D1D1D1")  # 眼睛1
    te.pensize(2)
    Moveto(206, 212)
    te.begin_fill()
    lineto(15, -7)
    curveto_r(4, -1, 26, -2, 30, 0)
    smooth_r(10, 3, 12, 7)
    te.pencolor("#D1D1D1")
    te.pensize(1)
    smooth_r(2, 27, -1, 30)
    smooth_r(-39, 5, -44, 1)
    Smooth(206, 212, 206, 212)
    te.end_fill()
    
    Moveto(384, 204)
    te.begin_fill()
    te.pencolor("black")
    te.pensize(2)
    curveto_r(-3, -1, -18, -1, -28, 1)
    smooth_r(-9, 6, -10, 9)
    te.pencolor("#D1D1D1")
    te.pensize(1)
    smooth_r(3, 18, 6, 23)
    smooth_r(38, 6, 40, 4)
    smooth_r(10, -9, 13, -22)
    te.pencolor("black")
    te.pensize(2)
    Lineto(384, 204)
    te.end_fill()
    # 图层_15
    te.color("#0C1631", "#0C1631")  # 眼睛2
    te.pensize(1)
    Moveto(216, 206)
    te.begin_fill()
    curveto_r(-1, 5, 0, 26, 7, 35)
    smooth_r(30, 2, 33, 0)
    smooth_r(5, -31, 2, -34)
    Smooth(219, 203, 216, 206)
    te.end_fill()
    
    Moveto(354, 207)
    te.begin_fill()
    curveto_r(-2, 1, 2, 29, 4, 31)
    smooth_r(30, 3, 33, 1)
    smooth_r(6, -24, 4, -27)
    lineto(-11, -8)
    Curveto(382, 204, 357, 206, 354, 207)
    te.end_fill()
    
    # 图层_17
    te.color("#F5F5F5", "#F5F5F5")  # 眼睛3
    Moveto(253, 211)
    te.begin_fill()
    curveto_r(-3, 0, -8, 8, 1, 10)
    Smooth(258, 210, 253, 211)
    te.end_fill()
    
    Moveto(392, 209)
    te.begin_fill()
    lineto(4, 3)
    vertical(4)
    lineto(-4, 2)
    Curveto(386, 214, 392, 209, 392, 209)
    te.end_fill()
    # 图层_18
    te.color("#352F53", "#352F53")  # 眼睛4
    Moveto(219, 229)
    te.begin_fill()
    smooth_r(2, -5, 6, -4)
    smooth_r(18, 13, 27, 1)
    curveto_r(3, 0, 5, 3, 5, 3)
    vertical(13)
    Horizontal(224)
    Lineto(219, 229)
    te.end_fill()
    
    Moveto(357, 227)
    te.begin_fill()
    smooth_r(4, -6, 10, -2)
    smooth_r(10, 13, 19, 1)
    curveto_r(6, 0, 8, 6, 8, 6)
    lineto(-2, 9)
    curveto_r(-12, 3, -29, 0, -32, -2)
    Smooth(357, 227, 357, 227)
    te.end_fill()
    
    # 图层_19
    te.color("#9A90CB", "#9A90CB")  # 眼睛5
    Moveto(227, 231)
    te.begin_fill()
    curveto_r(-6, 0, -5, 5, -3, 8)
    smooth_r(24, 2, 27, 0)
    smooth_r(0, -8, -1, -8)
    Smooth(234, 231, 227, 231)
    te.end_fill()
    
    Moveto(361, 227)
    te.begin_fill()
    curveto_r(2, 18, 26, 14, 30, 6)
    smooth_r(-1, -3, -2, -4)
    smooth_r(-15, 9, -24, -4)
    Curveto(363, 224, 361, 225, 361, 227)
    te.end_fill()
    
    # 图层_16
    te.pencolor("black")  # 眼睛(线条)
    te.pensize(3)
    # Moveto(206,213)
    # lineto(14,-8)
    # curveto_r(3,-1,30,0,33,1)
    # lineto(10,6)
    Moveto(225, 215)
    curveto_r(10, 28, 22, 16, 24, 6)
    Moveto(365, 219)
    curveto_r(4, 14, 18, 24, 22, -3)
    te.pensize(2)
    line(240.5, 207.5, 227.5, 211.5)
    line(245.5, 209.5, 227.5, 214.5)
    line(247.5, 211.5, 227.5, 217.5)
    line(247.5, 214.5, 229.5, 220.5)
    line(247.5, 218.5, 230.5, 223.5)
    line(246.5, 222.5, 232.5, 226.5)
    line(244.5, 225.5, 234.5, 228.5)
    
    line(377.5, 207.5, 367.5, 210.5)
    line(384.5, 207.5, 366.5, 212.5)
    line(385.5, 210.5, 366.5, 215.5)
    line(384.5, 213.5, 366.5, 218.5)
    line(384.5, 215.5, 367.5, 220.5)
    line(384.5, 218.5, 368.5, 223.5)
    # line(383.5,220.5,368.5,225.5)
    line(382.5, 223.5, 370.5, 227.5)
    # line(381.5,226.5,373.5,229.5)
    # 图层_20
    te.pencolor("black")
    Moveto(309, 270)  # 鼻子、嘴
    curveto_r(0, 0, 4, 7, 1, 9)
    line(296.5, 307.5, 303.5, 307.5)
    Moveto(315, 307)
    smooth_r(10, -1, 10, 2)
    
    te.penup()
    te.hideturtle()
    te.update()
    te.done()

    蟒蛇绘制及turtle库的使用

    环境要求

    • python3
    • 最好有一个ide,我用的是最基本的pycharm
    • 这是我根据mooc的教程写下来的(视频链接在文末),希望能给刚开始学习Python提供一个范例:
    • 这篇博文,我们将绘制一条蟒蛇,并解释turtle的使用。
    • 首先我们设计一下蟒蛇的基本形状,它是一条爬行的蟒蛇而且很有回头感,并且后面会看到它是可以动的:

    • 这就要要用计算机图形的绘制了,这与一般的简单的测试程序是不一样的,因为要涉及到窗口等的出现:
    • 全部的代码:
    # python.py
    import turtle
    turtle.setup(650,350,200,200)
    turtle.penup()
    turtle.fd(-250)
    turtle.pendown()
    turtle.pensize(25)
    turtle.pencolor("purple")
    turtle.seth(-40)
    for i in range(4):
    turtle.circle(40,80)
    turtle.circle(-40,80)
    turtle.circle(40,80/2)
    turtle.fd(40)
    turtle.circle(16,180)
    turtle.fd(40 * 2/3)
    turtle.done()
    #finish
    • 确保代码无误,执行后,就可以看到屏幕中出现窗口,并且出现了一个动态的,正在逐渐绘制的蟒蛇:

    直到全部完成

    • 从代码中我们可以很明显的看到使用了turtle这个库,那么每一行的代表什么意思呢?
      • turtle意思是海龟,是一个绘图库,是python的标准库之一(注意标准库与第三方库的区别),我们可以叫它海龟库,这是这个程序最关键的地方。
      • turtle(海龟)是一种真实的存在,可以理解为:
      • 有一只海龟,其实在窗体正中心,在画布上游走;
      • 走过的轨迹形成了绘制的图形
      • 海龟由程序控制,可以变换颜色,改变宽度等

    再来看一下一些有趣的示例(使用turtle)

    窗体布局

    • 在电脑显示中,左上角的像素坐标是(0,0),这里的turtle统一如此,可以使用setup()函数来社会中窗体大小以及位置
    turtle.setup(width,height,startx,starty)
    • (后两个坐标是可选的,指窗体左上角相对于屏幕左上角的坐标)
    • 在绘制过程中,setup函数并不是必须的,只有当你需要控制窗体的大小和位置时,采用setup进行限制。

    例如:

    • 空间坐标体系
      • 海龟最开始在画布的正中心,以此构成绝对坐标系,利用空间坐标和函数,可以改变海龟的位置
      • 如最重要的一个函数是
    # turtle.goto(x,y)
      • 它可以让任意位置的海龟去到达这个位置,例如:

    • 运动控制函数
      • turtle.forward(d)别名turtle.fd(d)
      • d表示行进距离,如果行进距离是负数,表示海龟是倒退着行进的。
      • turtle.bd(d)是向海龟的反方向运行
      • turtle.circle(r,angle)这是曲线函数,圆心在海龟的左手侧距离自己距为r的地方,想要绘制完整圆形,不要写第二个参数就好
    • 角度坐标体系
      • 我们可以使用下面函数来改变当前海龟的行进角度
      • turtle.seth(angle)
      • 这里的angle是将海龟当前的行进方向改变为某一个绝对角度(不是海龟方向,是绝对坐标系中的绝对方向)
      • 为了更好改变方向,还可以分别从左右两个方向改变角度(这个是海龟角度)
      • turtle.left(angle)
      • turtle.right(angle)
      • 要注意的是,改变角度的函数只会改变方向,但是不会自动行进,需要配合其他函数,比如turtle.fd(d)来使用。
    • 例如:

    • 现在我们再看上面的程序是不是感觉很熟悉了呢,虽然还是有些不是完全懂,别着急,我们慢慢看下面:
    • 画笔控制函数
      • 这里将海龟想象为画笔pen
      • 画笔成对出现
      • turtle.penup()别名turtle.pu()抬起画笔,海龟在飞行
      • turtlependown()别名turtle.pd()落下画笔,海龟在爬行
    • 另外:
      • turtle.pensize(width)用来设置画笔宽度。
      • turtle.pencolor(color)设置颜色,里面填rgb值。
      • 这里要注意要把rge压成0-1(除以255即可)

    • 循环结构与range
    • python循环语句最常用方式
    • for i(计数变量) in range(循环次数) 后面缩进的代码将被循环执行
    • range()产生循环计数序列
    • range(n)
    • range(m,n)产生从m到n-1的整数序列
    • 看到这个,基本上上面的蟒蛇代码应该已经能全部看懂了,而且可以自己做出很多改变。这里写一下注释:
    # python.py
    import turtle
    turtle.setup(650,350,200,200)#设置窗体位置和大小
    turtle.penup()
    turtle.fd(-250)
    turtle.pendown()#海龟飞起落下 这三行相当于海龟的原点改变了
    turtle.pensize(25)
    turtle.pencolor("purple")
    turtle.seth(-40)#设置刚开始的绝对角度
    for i in range(4):
    turtle.circle(40,80)
    turtle.circle(-40,80)#4绘制蟒蛇的4个小节
    turtle.circle(40,80/2)#绘制少半个弧形
    turtle.fd(40)
    turtle.circle(16,180)#脖子和头部绘制
    turtle.fd(40 * 2/3)
    turtle.done()#这行代码使得程序运行后程序不会退出,需要手动关闭窗口
    #finish
    • 可以把import turtle调库函数换成from turtle import*,这样后面就可以不用一直加turtle.了,直接写函数就ok,只要注意不要重名就可以,或者也可以import turtle as+别名的方式。

    视频学习链接: 这是2019下半年的开课,应该每年都会有开课,讲的真的很好

  • 相关阅读:
    未格式化的输入/输出操作
    格式化输入与输出
    随机数
    正则表达式
    bitset
    tuple
    servlet笔记
    springside
    maven
    Lua简易入门教程
  • 原文地址:https://www.cnblogs.com/yangmaosen/p/12510792.html
Copyright © 2011-2022 走看看