Python基本图形绘制库——turtle

明天你好 2020-03-06

(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

Python基本图形绘制库——turtle

(4).turtle空间坐标体系

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

 1)绝对坐标

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

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

Python基本图形绘制库——turtle

 2)海龟坐标

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

Python基本图形绘制库——turtle

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

Python基本图形绘制库——turtle

(5).turtle角度坐标体系

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

 1)绝对角度

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

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

Python基本图形绘制库——turtle

 2)海龟角度

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

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

Python基本图形绘制库——turtle

(6).turtle的RGB色彩体系

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

常用的RGB色彩如下:

英文名称RGB整数值RGB小数值中文名称
white255,255,2551,1,1白色
yellow255,255,01,1,0黄色
magenta255,0,2551,0,1洋红
cyan0,255,2550,1,1青色
blue0,0,2550,0,1蓝色
black0,0,00,0,0黑色
seashell255,245,2381,0.96,0.93海贝色
gold255,215,01,0.84,0金色
pink255,192,2031,0.75,0.80粉红色
brown165,42,420.65,0.16,0.16棕色
purple160,32,2400.63,0.13,0.94紫色
tomato255,99,711,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像素<br />

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

效果图:

Python基本图形绘制库——turtle

 2)绘制一个正六边形

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

效果图

Python基本图形绘制库——turtle

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

Python基本图形绘制库——turtle

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)绘制一个如图所示的太阳花

Python基本图形绘制库——turtle

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

效果图如下:

Python基本图形绘制库——turtle

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

效果图如下:

Python基本图形绘制库——turtle

参考: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

相关推荐