Python绘图Turtle库详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python绘图Turtle库详解相关的知识,希望对你有一定的参考价值。

参考技术A        Turtle库是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",也可以是RGB 3元组。

        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()返回最后记录的多边形。

Python基本图形绘制库——turtle

(1).介绍

  turtle库也叫海龟库,是turtle绘图体系的Python实现。turtle库是Python语言的标准库之一,是入门级的图形绘制函数库。

  turtle绘图体系:也叫海龟绘图系统,它是在1969年诞生,主要用于程序设计入门的一种绘图方式。

  Python计算生态 = 标准库 + 第三方库

  标准库:随解释器直接安装到操作系统中的功能模块。

  第三方库:需要经过安装才能使用的功能模块。

  turtle官方文档:https://docs.python.org/3/library/turtle.html

(2).原理

  turtle(海龟)是真实的存在,可以想象成一只海龟在窗体正中间,由程序控制在画布上游走,走过的轨迹形成了绘制的图形,可以变换海龟的颜色和宽度等。这里海龟就是我们的画笔。

(3).turtle的绘图窗体布局

  绘制turtle图形首先需要一个绘图窗体,在操作系统上表现为一个窗口,它是turtle的一个画布空间。在窗口中使用的最小单位是像素,例如要绘制一个100单位长度的直线,就是指100像素长的直线。

  在一个操作系统上,将显示器的左上角坐标定义为(0,0),那么我们将窗体的左上角定义为turtle绘图窗体的坐标原点,相对于整个显示器坐标为(startx,starty)。这里可以使用turtle.setup(width,height,startx,starty)来设置启动窗体的位置和大小,当然setup()函数并不是必须的。而且在setup()函数中startx和starty参数是可选的,如果没有指定这两个参数,那么系统会默认该窗体在显示器的正中心。

  参数说明:

   width和height:如果是整数,则为像素大小;如果是浮点数则为屏幕的百分比。width默认为屏幕的50%,height默认为屏幕的70%。

   startx和starty:如果为正,则为距屏幕左侧或顶部的像素长度;如果为负,则为举例屏幕右侧或底部的像素长度;如果为None,则水平或垂直居中。

  更多窗体控制请查看turtle官方文档:https://docs.python.org/3/library/turtle.html

(4).turtle空间坐标体系

   在turtle窗体内部形成了一个空间坐标体系,包含绝对坐标和海龟坐标两种。

 1)绝对坐标

   对于绝对坐标来讲,turtle也就是海龟最开始出现的地方,即画布的正中心作为绝对坐标的(0,0)。海龟的运行方向向着画布的右侧,所以整个窗体的右方向为x轴,上方向为y轴,由此构成了绝对坐标系。

  绝对坐标系在绘图时经常用到,与之相关的最重要的函数是turtle.goto(x,y),该函数是让任意位置的海龟到达指定位置

 

 2)海龟坐标

  对于海龟坐标来讲,无论海龟朝向什么方向,海龟当前行进方向都叫前进方向,反方向是后退方向,左侧是左侧方向,右侧是右侧方向

 

  与之相关的常用函数有:turtle.fd(d),前进d像素距离;turtle.bk(d),后退d像素距离,海龟方向不变;turtle.circle(r,angle),以海龟左侧为原点,半径为r像素,行进angle度圆形弧度,并且海龟方向改变angle度,如果没有angle,那么行进一个完整的圆。注意:d、r、angle允许负数,意为反方向

(5).turtle角度坐标体系

  turtle建立了一个空间坐标体系,那么在空间坐标中,海龟行进的方向也有一个角度,同样分为绝对角度和海龟角度。

 1)绝对角度

  对于绝对角度来讲,绝对坐标的x正轴表示0度或360度,y正轴表示90度或-270度,x负轴表示180度或-180度,y负轴表示270度或-90度。

  与之相关的常用函数为turtle.seth(angle),用于改变海龟行进方向,只改变方向不行进。

 

 

 2)海龟角度

  对于海龟角度来讲,为了更好的改变海龟的行进方向,使用左右的方式来改变它的行进角度。

  与之相关的函数有:turtle.left(angle)和turtle.right(angle),分别让海龟向左或向右改变行进方向。

 

 

(6).turtle的RGB色彩体系

  turtle库中采用了计算机最常见的RGB色彩体系,取值范围可以是0-255的整数,也可以是0-1的小数。

  常用的RGB色彩如下:

英文名称 RGB整数值 RGB小数值 中文名称
white 255,255,255 1,1,1 白色
yellow 255,255,0 1,1,0 黄色
magenta 255,0,255 1,0,1 洋红
cyan 0,255,255 0,1,1 青色
blue 0,0,255 0,0,1 蓝色
black 0,0,0 0,0,0 黑色
seashell 255,245,238 1,0.96,0.93 海贝色
gold 255,215,0 1,0.84,0 金色
pink 255,192,203 1,0.75,0.80 粉红色
brown 165,42,42 0.65,0.16,0.16 棕色
purple 160,32,240 0.63,0.13,0.94 紫色
tomato 255,99,71 1,0.39,0.28 番茄色

  turtle库默认采用RGB的小数值来表示颜色,当然也可以使用函数turtle.colormode(mode)来切换RGB数值模式。当mode为1.0时表示采用小数值来表现RGB,当mode为255时表示采用整数值来表现RGB。

  与颜色设置相关的函数:turtle.color()、turtle.pencolor()、turtle.fillcolor(),由于设置画笔颜色和填充色;还有turtle.bgcolor(),设置窗体背景色。

(7).turtle常用函数

  注意:设置参数后,如果没有取消或重新设置,那么当前程序内一直有效。

 1)画笔控制函数

  turtle.penup()、turtle.pu()、turtle.up():抬笔,移动时不绘图

  turtle.pendown()、turtle.pd()、turtle.down():落笔,移动时绘图

  turtle.pensize(width)、turtle.width(width):画笔宽度

  turtle.pencolor(*args):如果不给参数,则返回当前画笔颜色,给出参数则是设定画笔颜色。设置颜色有三种方式的参数,pencolor(colorstring)、pencolor((r,g,b))和pencolor(r,g,b)

 2)运动控制函数

  turtle.forward(distance)、turtle.fd(distance):前进distance像素

  turtle.backward(distance)、turtle.bk(distance)、turtle.back(distance):后退distance像素

  turtle.circle(r,angle):以画笔(海龟)左侧为圆心,半径为r像素,画angle度的圆形。注意:海龟方向同时发生angle度变化

  turtle.goto(x,y)、setpos(x,y)、setposition(x,y):由当前坐标前往指定坐标,这里使用绝对坐标,但画笔方向不会改变

 3)方向控制函数

  turtle.setheading(angle)、turtle.seth(angle):以绝对角度改变方向

  turtle.left(angle)、turtle.lt(angle):以海龟角度向左改变方向

  turtle.right(angle)、turtle.rt(angle):以海龟角度向右改变方向

 4)更多

  更多函数请前往官方文档查看:https://docs.python.org/3/library/turtle.html

(8).实例

 1)绘制一个正方形

import turtle
turtle.pensize(2)
for i in range(4):
    turtle.fd(150)
    turtle.left(90)
turtle.done()

  效果图:

 

 2)绘制一个正六边形

import turtle
turtle.pensize(2)
for i in range(6):
    turtle.fd(150)
    turtle.left(60)
turtle.done()

  效果图

 

 3)绘制一个如图所示的风轮

import turtle
turtle.pensize(2)
for i in range(4):
    turtle.fd(150)
    turtle.left(90)
    turtle.circle(150,-45)
    turtle.goto(0,0)
    turtle.left(45)

 4)绘制一个如图所示的太阳花

from turtle import *
color(\'red\', \'yellow\')  #设置画笔颜色为红色,填充色为黄色
begin_fill()    #开始填充,必须与end_fill()一起使用
while True: #循环,这里是死循环,通过下方if语句控制跳出循环
    forward(200)    #前进200像素
    left(170)   #海龟角度,左转170度
    if abs(pos()) < 1:  #abs()返回绝对值,pos()返回当前坐标点,合起来是(0,0)到当前坐标的长度,用于判断是否回到(0,0)
        break  #跳出循环
end_fill()  #结束填充,运行到这里才会填充颜色
done()  #结束后停留在当前窗口

 5)绘制一个玫瑰花

import turtle

turtle.speed(5)
# 设置初始位置
turtle.penup()
turtle.goto(0,200)
turtle.pendown()
# 花蕊
turtle.fillcolor("red")
turtle.begin_fill()
turtle.circle(10,180)
turtle.circle(25,110)
turtle.left(50)
turtle.circle(60,45)
turtle.circle(20,170)
turtle.right(24)
turtle.fd(30)
turtle.left(10)
turtle.circle(30,110)
turtle.fd(20)
turtle.left(40)
turtle.circle(90,70)
turtle.circle(30,150)
turtle.right(30)
turtle.fd(15)
turtle.circle(80,90)
turtle.left(15)
turtle.fd(45)
turtle.right(165)
turtle.fd(20)
turtle.left(155)
turtle.circle(150,80)
turtle.left(50)
turtle.circle(150,90)
turtle.end_fill()

# 花瓣1
turtle.left(150)
turtle.circle(-90,70)
turtle.left(20)
turtle.circle(75,105)
turtle.setheading(60)
turtle.circle(80,98)
turtle.circle(-90,40)

# 花瓣2
turtle.left(180)
turtle.circle(90,40)
turtle.circle(-80,98)
turtle.setheading(-83)

# 叶子1
turtle.fd(30)
turtle.left(90)
turtle.fd(25)
turtle.left(45)
turtle.fillcolor("green")
turtle.begin_fill()
turtle.circle(-80,90)
turtle.right(90)
turtle.circle(-80,90)
turtle.end_fill()  

turtle.right(135)
turtle.fd(60)
turtle.left(180)
turtle.fd(85)
turtle.left(90)
turtle.fd(80)  

# 叶子2
turtle.right(90)
turtle.right(45)
turtle.fillcolor("green")
turtle.begin_fill()
turtle.circle(80,90)
turtle.left(90)
turtle.circle(80,90)
turtle.end_fill()

turtle.left(135)
turtle.fd(60)
turtle.left(180)
turtle.fd(60)
turtle.right(90)
turtle.circle(200,60)
turtle.done()

  效果图如下:

 

 6)樱花树(大佬NB!!)

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

  效果图如下:

 

 

参考:https://www.cnblogs.com/chen0307/articles/9645138.html

   https://blog.csdn.net/as_csdn/article/details/93086075

   https://blog.csdn.net/weixin_43943977/article/details/102691392

   https://blog.csdn.net/sandalphon4869/article/details/99443949

以上是关于Python绘图Turtle库详解的主要内容,如果未能解决你的问题,请参考以下文章

Python绘图之Turtle库详解

Python绘图之Turtle库详解

python课程设计笔记turtle绘图库(海龟库)

python绘图之turtle库函数的用法

python少儿编程-turtle 基本绘图

Python绘图turtle库乌龟绘图官方文档详细整理