zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    记一次文件上传远程服务器问题
    Python模块——loguru日志模块简单学习
    Python使用百度地图API根据地名获取相应经纬度
    Python用正则表达式匹配汉字
    【工具】下载与使用(感谢博友)
    【umask】安装产品,脚本中创建目录后注意刷权限
    【凝聚】引荐优笔
    【解决办法1】centos75 No manual entry for XXXX in section X
    【填坑1】CentOS7 systemctrl管理的服务,open files的神坑
    错题记录(二)
  • 原文地址:https://www.cnblogs.com/dydxw/p/11155746.html
Copyright © 2011-2022 走看看