• Python内置Turtle绘图库方法简介+多案例


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

    turtle绘图的基础知识:

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

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

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

    2.画笔

    2.1画笔的状态

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

    2.2画笔的属性

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

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

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

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

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

    返回最后记录的多边形。

    3.命令详解

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

    描述:以给定半径画圆

    参数:

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

    extent(弧度)(optional);

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

    举例:

    circle(50)#整圆;

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

    circle(120,180)#半圆

    4.实例

    1、圈圈圆圆--入门

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # coding=utf-8
    # 体验画圆
    # 导入海龟画图
    import turtle

    turtle.pensize(2) # 画笔大小

    turtle.circle(10) # 圆的大小,绘制半径为10像素的圆
    turtle.circle(20)
    turtle.circle(40)
    turtle.circle(80)
    turtle.circle(160)

    turtle.done() # 用来停止画笔绘制,绘图窗体不关闭。

    2、五角星

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # coding=utf-8
    import turtle
    import time
      
    turtle.pensize(5)
    turtle.pencolor("yellow")
    turtle.fillcolor("red")
      
    turtle.begin_fill()
    for _ in range(5):
     turtle.forward(200)
     turtle.right(144)
    turtle.end_fill()
    time.sleep(2)
       
    turtle.penup()
    turtle.goto(-150,-120)
    turtle.color("violet")
    turtle.write("Done", font=('Arial', 40, 'normal'))
      
    turtle.mainloop()

    3、时钟程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    # 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()

    画一个边长为60的正方形,并填充为红色,边框为蓝色

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #-*- coding: utf-8 -*-
    import turtle
    turtle.reset()
    a= 60
    turtle.fillcolor("red")
    turtle.pencolor("blue")
    turtle.pensize(10)
    turtle.fill(True)
    turtle.left(90)
    turtle.forward(a)
    turtle.left(90)
    turtle.forward(a)
    turtle.left(90)
    turtle.forward(a)
    turtle.left(90)
    turtle.forward(a)
    turtle.fill(False)

    最后一个实例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    from numpy import *
    from random import random
    import turtle
    turtle.reset()
    x = array([[.5],[.5]])
    p = [0.85,0.92,0.99,1.00]
    A1 = array([[.85, 0.04],
          [-0.04,.85]])
    b1 = array([[0],[1.6]])
    A2 = array([[0.20,-0.26],
          [0.23,0.22]])
    b2 = array([[0],[1.6]])
    A3 = array([[-0.15,0.28],
          [0.26,0.24]])
    b3 = array([[0],[0.44]])
     
    A4 = array([[0,0],
          [0,0.16]])
     
    turtle.color("blue")
    cnt = 1
    while True:
      cnt += 1
      if cnt == 2000:
        break
      r = random()
      if r < p[0]:
        x = dot(A1 , x) + b1
      elif r < p[1]:
        x = dot(A2 , x) + b2
      elif r < p[2]:
        x = dot(A3 , x) + b3
      else:
        x = dot(A4 , x)
      #print x[1]
      turtle.up()
      turtle.goto(x[0][0] * 50,x[1][0] * 40 - 240)
      turtle.down()
      turtle.dot()

    更多内容链接

    更多讲解:https://blog.csdn.net/sandalphon4869/article/details/99443949

    更多例子:https://blog.csdn.net/sandalphon4869/article/details/99632566

  • 相关阅读:
    QQ邮箱自动删除邮件脚本
    5ppm高精度自动同步标准化考场时钟系统
    GPS时钟之户外防水防雷细节
    C/C++ Compile Run插件,使用某些头文件出现重定义的错误,解决方法为修改MinGW的路径
    7zip 通过指令压缩 仅存储压缩 分压缩卷 / 对文件夹里的文件进行解压,解压到对应文件名所在的文件夹上
    循环队列FIFO
    cglib和jdk代理的字节码生成配置
    SpringXML的beans标签后的一串网址相关的属性有什么用
    service和server这两个单词的区别
    没有代码提示的地方,前后引用记得用复制不要手打
  • 原文地址:https://www.cnblogs.com/zwnsyw/p/12976584.html
Copyright © 2020-2023  润新知