Python小达人
Python课程记录在此!我从基础开始学,基本功很扎实~

Python基础图形绘制库—turtle — Turtle graphics

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

发表评论

您的电子邮箱地址不会被公开。