Python基本图形绘制库——turtle

(1).介绍html

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

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

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

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

  第三方库:须要通过安装才能使用的功能模块。函数

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

(2).原理spa

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

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

  绘制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

   http://www.javashuo.com/article/p-rkczboot-d.html

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

相关文章
相关标签/搜索