zoukankan      html  css  js  c++  java
  • Turtle库的学习积累

    1.什么是turtle库

      Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。

    2.turtle绘制图像基础

    2.1 画布

      画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置。

            设置画布大小

    width : 窗口宽度,值为整数则对应像素值;值为小数则为窗口宽度与屏幕的比例。

    height : 窗口高度,值为整数则对应像素值;值为小数则为窗口高度与屏幕的比例。

    startx : 窗口左侧与屏幕左侧的像素距离,值为None则窗口位于窗口水平中央。

    starty : 窗口右侧与屏幕右侧的像素距离,值为None则窗口位于窗口垂直中央。

             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),参数:width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例,(startx, starty): 这一坐标表示矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。

            如:turtle.setup(width=0.6,height=0.6)

                   turtle.setup(width=800,height=800, startx=100, starty=100)

    setup ( width , height , startx , starty )

     


     2.2画笔:

    2.2.1 画笔的状态:

            在画布上,默认有一个坐标原点为画布中心的坐标轴,坐标原点上有一只面朝x轴正方向小乌龟。这里我们描述小乌龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中,就是使用位置方向描述小乌龟(画笔)的状态。

    2.2.2 画笔的属性:

            画笔(画笔的属性,颜色、画线的宽度等)

            1) turtle.pensize():设置画笔的宽度;

            2) turtle.pencolor():没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组。

            3) turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。

    2.2.3 绘图命令

             操纵海龟绘图有着许多的命令,这些命令可以划分为3种:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。

    (1)    画笔运动命令

    命令

    说明

    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)

    绘制一个指定直径和颜色的圆点

    (2)     画笔控制命令

    命令

    说明

    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形状

    (3)    全局控制命令

    命令

    说明

    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参数也是可选项

    (4)    其他命令

    命令

    说明

    turtle.mainloop()或turtle.done()

    启动事件循环 -调用Tkinter的mainloop函数。

    必须是乌龟图形程序中的最后一个语句。

    turtle.mode(mode=None)

    设置乌龟模式(“standard”,“logo”或“world”)并执行重置。如果没有给出模式,则返回当前模式。

    模式

    初始龟标题

    正角度

    standard

    向右(东)

    逆时针

    logo

    向上(北)

    顺时针

    turtle.delay(delay=None)

    设置或返回以毫秒为单位的绘图延迟。

    turtle.begin_poly()

    开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。

    turtle.end_poly()

    停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。

    turtle.get_poly()

    返回最后记录的多边形。

    2.3. 命令详解

            turtle.circle(radius, extent=None, steps=None)

            描述:以给定半径画圆

            参数:

            radius(半径):半径为正(负),表示圆心在画笔的左边(右边)画圆;

            extent(弧度) (optional);

            steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)。

           举例:

           circle(50) # 整圆;

           circle(50,steps=3) # 三角形;

           circle(120, 180) # 半圆

    #RGB色彩体系

     rgb的色彩取值范围为0-255的整数或者0-1的小数

      

      

    切换RBG模式

    turtle.colormode(mode)

      1.0:RGB小数模式

      255:RGB整数模式

    2.4.形状绘制函数

    turtle.fd(distance) / forward(distance) 作用:向小乌龟前进的方向前进distance距离,distance 为前进距离的像素值

    turtle.bk(distance) / backward(distance)  作用:向小乌龟前进的方向后退distance距离,distance 为后退距离的像素值

    turtle.lt(angle) / left(angle) 作用:左转,angle 为左转的角度

    turtle.rt(angle) / right(angle) 作用:angle 为右转的角度

    turtle.seth(angle) / setheading(angle)  作用:angle 为转到的角度,即改变绘图的方向

    turtle.circle(radius [,extent])  作用:绘制以radius为半径、以angle为角度弧形

      (extent 为None时,绘制整个圆;radius 为正数时,绘制的图形在小海龟左侧;radius 为负数时,绘制的图形在小海龟右侧)

    turtle.ht() / hideturtle()  作用:隐藏小海龟

    turtle.st() / showturtle()  作用:显示小海龟

    turtle.fillcolor(colorstring)  作用:填充颜色

    turtle.begin_fill()  作用:开始填充图形

    turtle.end_fill()  作用:填充完成

    2.5 控制命令

    命令

    说明

    home()

    使小海龟回到初始位置 (0,0)

    clear()

    清空窗口,但小海龟的位置和状态不变

    reset()

    清空窗口,且重置小海龟的状态为初始状态

    undo()

    撤销上一个动作

    stamp()

    复制当前图形

    write(s [,font=(“font_name”,font_size,”font_type”)])

    文本,s 为文本内容,font 是字体的参数,内部分别是字体名称,大小和类型

     

    3.绘制图像实例

    (1)玫瑰花绘制

     

    import turtle as t               # 定义一个曲线绘制函数(用t来代替turtle)
    def DegreeCurve(n, r, d=1):
    for i in range(n):
    t.left(d)
    t.circle(r, abs(d))                # 初始位置设定
    s = 0.2 # 尺寸
    t.setup(450*5*s, 750*5*s)            #设置窗口大小
    t.pencolor("black")              #画笔颜色
    t.fillcolor("red")                 #填充颜色
    t.speed(100)                 #加速
    t.penup()                    #下笔
    t.goto(0, 900*s)
    t.pendown()                  # 绘制花朵形状
    t.begin_fill()                    #开始
    t.circle(200*s,30)
    DegreeCurve(60, 50*s)
    t.circle(200*s,30)
    DegreeCurve(4, 100*s)
    t.circle(200*s,50)
    DegreeCurve(50, 50*s)
    t.circle(350*s,65)
    DegreeCurve(40, 70*s)
    t.circle(150*s,50)
    DegreeCurve(20, 50*s, -1)
    t.circle(400*s,60)
    DegreeCurve(18, 50*s)
    t.fd(250*s)
    t.right(150)
    t.circle(-500*s,12)
    t.left(140)
    t.circle(550*s,110)
    t.left(27)
    t.circle(650*s,100)
    t.left(130)
    t.circle(-300*s,20)
    t.right(123)
    t.circle(220*s,57)
    t.end_fill()                  # 结束花瓣的绘制
    t.left(120)                 # 开始绘制花枝
    t.fd(280*s)
    t.left(115)
    t.circle(300*s,33)
    t.left(180)
    t.circle(-300*s,33)
    DegreeCurve(70, 225*s, -1)
    t.circle(350*s,104)
    t.left(90)
    t.circle(200*s,105)
    t.circle(-500*s,63)
    t.penup()
    t.goto(170*s,-30*s)
    t.pendown()
    t.left(160)
    DegreeCurve(20, 2500*s)
    DegreeCurve(220, 250*s, -1)          # 结束
    t.fillcolor('green')                # 绘制一个绿色叶子
    t.penup()
    t.goto(670*s,-180*s)
    t.pendown()
    t.right(140)
    t.begin_fill()
    t.circle(300*s,120)
    t.left(60)
    t.circle(300*s,120)
    t.end_fill()
    t.penup()
    t.goto(180*s,-550*s)
    t.pendown()
    t.right(85)
    t.circle(600*s,40)              # 结束
    t.penup()                  # 绘制另一个绿色叶子
    t.goto(-150*s,-1000*s)
    t.pendown()
    t.begin_fill()
    t.rt(120)
    t.circle(300*s,115)
    t.left(75)
    t.circle(300*s,100)
    t.end_fill()
    t.penup()
    t.goto(430*s,-1070*s)
    t.pendown()
    t.right(30)
    t.circle(-600*s,35)
    t.done()                 #玫瑰花结束绘制

     

     

     

     (2)时钟程序

    # 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)  

        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()  

     

  • 相关阅读:
    IOS-SQLite3的封装
    IOS-SQLite3
    IOS-真机相关
    IOS-将任意对象存进数据库
    IOS-支付宝
    IOS-推送通知
    iOS-证书真机调试
    iOS-免证书真机调试
    iOS-沙盒路径
    Android之发送短信的两种方式
  • 原文地址:https://www.cnblogs.com/Exin/p/10527263.html
Copyright © 2011-2022 走看看