如果你认为Python 智能做那些冰冷冷的数据处理,那你就错了,Python 也可以做很多有趣的事情,比如同学们最喜欢的画画,Python 也非常“擅长”,它甚至可以绘制出一幅与众不同的画作。那Python 陛下的画作是什么样的呢?

让我们拭目以待吧!

海龟绘图很适合用来引导孩子学习编程。 最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言。

turtle 模块提供 面向对象面向过程 2种形式的海龟绘图基本组件。由于它使用 tkinter 实现基本图形界面,因此需要安装了 Tk 支持的 Python 版本。

turtle(海龟)是Python内置的一个标准模块,它提供了绘制线、圆以及其它形状的函数,使用该模块可以创建图形窗口,在图形窗口中通过简单重复动作直观地绘制界面与图形。

turtle的使用主要分为以下三个方面:

  • 创建窗口
  • 设置画布
  • 绘制图形
    • 海龟运动
    • 画笔控制
    • 海龟状态
    • 使用事件
    • 特殊海龟方法
    • … Screen 方法…
    • 窗口控制
    • 动画控制
    • 使用屏幕事件
    • 设置与特殊方法
    • 输入方法
    • Screen 专有方法

1. turtle 的坐标系

turtle 坐标系有两个:一个是 (窗口)画布 在整个计算机屏幕中的坐标系,另外一个是 画笔 在整个(窗口)画布中的坐标系。

1.1 画布在屏幕中的坐标系

画布在计算机屏幕中的坐标系如下:

在这里插入图片描述

画布的(0,0) 坐标位于屏幕的左上方。
做小单位为像素。
setup()函数设置画布大小及位置,格式为:

  • turtle.setup(width, height, startx=None, starty=None)

参数功能如下:

在这里插入图片描述

参数使用小提示:

  • setup()函数不是必须的,只有当需要改变画布大小或者坐标位置的时候使用;如果没有setup()函数,直接用turtle 进行绘图,画布默认的尺寸为800像素 * 600 像素, 并且位于计算机屏幕的中央

  • setup()的4个参数,可以没有坐标信息,甚至可以连4个参数都没有。如果4个参数没有,则按照默认尺寸和位置进行设置;

  • setup()前2个参数可以使用小于等于1.0的小数表示,代表的是画布的大小占整个计算机屏幕尺寸的比例。 比如 turtle.setup(1.0, 1.0)代表的是按照屏幕尺寸(宽和高)100%的比例进行设置,turtle.setup(0.5, 0.5)代表的是按照计算机屏幕尺寸的 50%比例缩小画布。

import  turtle

#创建一个宽度为800像素,高度为600像素,并且位于屏幕中心
turtle.setup(800,600)

turtle.done() # mainloop 屏幕事件之主循环,防止窗口一闪而过

1.2 画笔在画布中的坐标系

画笔在画布中的坐标系和画布在屏幕中的坐标系是不一样的,最大的不同是画布的正中是坐标系的原点(0,0),如下所示:

在这里插入图片描述

在这里插入图片描述

让小海龟走到指定的坐标,对应的命令是:turdle.goto(x,y),坐标的单位为像素。

易错点

  • (1)两个坐标系的原点位置不同,要注意在设置哪个坐标系。
  • (2)setup() 不是必需 的,默认画布尺寸为800像素 * 600像素,而并非400像素 * 300像素。

2. turtle 的画笔的体系

2.1 画笔的命名

在turtle 中可以有多支画笔, 但是每一支画笔都必须要有自己独有的名字,如果只有一支画笔,则不需要命名。

画笔命名函数:turtle.Pen(); 格式为 pen1 = turtle.Pen(), 前面的pen1 为画笔的名称。命名画笔后,该画笔的所有函数均需要在前面加上画笔名称,不能在使用默认的turtle 前缀。

2.2 画笔设置函数

turtle.pensize(a)函数

turtle.width(width=None)

作用:设置画笔的粗细

参数 :width – 一个正数值, 代表画笔的像素数量

设置线条的粗细为 width 或返回该值。如果 resizemode 设为 “auto” 并且 turtleshape 为多边形,该多边形也以同样组细的线条绘制。如未指定参数,则返回当前的 pensize。

turtle.penup()函数

作用:画笔抬起 – 移动时不画线。

特别说明:抬笔后,画笔的所有操作和移动都不会在画布上留下痕迹。

注意:turtle模块中为penup()和pendown()函数定义了别名,penup()函数的别名为pu(); pendown()函数的别名为pd()

turtle.pendown()函数

作用:画笔落下 – 移动时将画线。

特别说明:画笔落下后,才能绘制图形。

turtle.hideturtle()

作用:隐藏小海龟,表示不显示小海龟

特别说明:隐藏并不影响小海龟绘图,即隐藏后小海龟还是可以绘图的。

turtle.showturtle()

作用: 显示小海龟

turtle.shape()和turtle.Turtle()

turtle.shape(name=None)

作用:设置小海龟的形状

参数 :name – 一个有效的形状名字符串。

设置海龟形状为 name 指定的形状名,如未指定形状名则返回当前的形状名。name 指定的形状名应存在于 TurtleScreen 的 shape 字典中。多边形的形状初始时有以下几种: “arrow”, “turtle”, “circle”, “square”, “triangle”, “classic”。

特别说明:默认小海龟的形状为“classic” ;参数作为字符串,所以必须加上引号,例如:turtle.shape("turtle")

write() 函数

turtle.write(arg, move=False, align='left', font=('Arial', 8, 'normal'))

作用:在小海龟当前位置书写文字

参数:

  • arg – 要书写到 TurtleScreen 的对象
  • move – True/False
  • align – 字符串 “left”, “center” 或 “right”
  • font – 一个三元组 (fontname, fontsize, fonttype)

基于 align (“left”, “center” 或 “right”) 并使用给定的字体将文本 —— arg 的字符串表示形式 —— 写到当前海龟位置。 如果 move 为真值,画笔会移至文本的右下角。 默认情况下 move 为 False。

from turtle import *
import turtle

turtle.setup(800, 600)   # 设置(窗口)画布尺寸大小
turtle.bgcolor("white")  # 设置画布背景为白色

turtle.write("Home = ", True, align="center")  # 参数arg 为字符串
turtle.write((0, 0), True)  # 参数arg 为元组

turtle.done()  # 防止画布一闪而过

效果如下:

在这里插入图片描述


2.3 颜色相关的设置(画布、画笔、图形填充)

turtle.pencolor(color)

作用:设置画笔的颜色

参数 color 有两种表示方式。

  • pencolor(colorstring) — 字符串形式,内容为颜色的英文,字母用小写,如“red”、“green”、“black”等等。
  • pencolor((r, g, b)) — RGB三元组值形式,RGB是工业界的一种颜色标准,数值越大,该颜色越深,如 turtle.pencolor(255, 255, 255)代表的是白色 ,(0, 0, 0)是黑色。注意:在使用RGM三原色时,需要在程序前面声明 turtle.colorcode(255)将颜色设置成RGB模式。

turtle.color(color1, color2)

作用:同时设置画笔及填充的颜色。

参数:第一个参数color1代表的是画笔的颜色,第二个参数color2 代表的是填充的颜色。

特别说明:如果只有一个参数,则代表该颜色既是画笔颜色也是填充颜色。参数color1 和 color2 都可以使用RGB表示。

turtle.fillcolor(color)

作用 :设置填充颜色

参数:color 代表是填充颜色。

特别说明:填充颜色需要在开始填充前进行声明才有效。参数可以使用RGM模式表示。

turtle.begin_fill()

作用:设置填充的起点,表示开始填充。

特别说明:开始填充和结束填充必须配对使用。

turtle.end_fill()

作用:设置填充的终点,表示结束填充。

特别说明:结束填充和开始填充必须配对使用。

turtle.bgcolor(color)

作用:设置画布的背景颜色。

特别说明:color 为背景颜色的文本名或RGM数值。

易错点

  • (1) 命名多支画笔时必须使用turtle.Pen() ,命名的格式为 a = turtle.Pen() 。这里P 要大写。
  • (2) 所有的颜色设置,均可以用字符串和RGB 两种模式,但是在字符串模式下,颜色名称一定要加引号。
  • (3) 所有的颜色设置也可以用RGB 值来表示。
  • (4) turtle.begin_fill() 函数必须要在开始绘制需要填充的图形前就声明。
  • (5) turtle.Turtle() 命令除了可以设置小海龟的形状外,还可以进行多支画笔的设置。

示例代码:

import turtle

turtle.pensize(5)
turtle.fillcolor("red")     # 开始填充前声明填充颜色
turtle.begin_fill()
turtle.color("yellow")     # 设置画笔和填充颜色都是黄色
turtle.circle(50, steps=6) 
turtle.end_fill()
turtle.hideturtle()

turtle.done()  # 防止画布一闪而过

输出效果:

在这里插入图片描述


3. turtle 的运动体系

3.1 turtle 的相对方向

小海龟(画笔)在画布上是与方向的,默认的小海龟的头部(前方)为屏幕的右侧,尾部(后方)为屏幕的左侧,小海龟的左侧为屏幕的上方。

在这里插入图片描述

小海龟(画笔)的方向会随着画笔的方向改变而改变,所以,该方向为相对方向, 以小海龟的头部所朝向的前方为标准简历新的方向体系。

对应的函数有:

  • turtle.forward(distance)
  • turtle.backward(distance)
  • turtle.circle(radius,extent=None,steps=None)
  • turtle.left(angle)
  • turtle.right(angle)

3.2 turtle 的绝对方向

除了相对于小海龟头部方向的相对方向之外,turtle 还有绝对方向, 其特征如下。

  • (1) 绝对方向是不变的;
  • (2)绝对方向的划分如图。屏幕的右方为 0°起点,也是360°终点;屏幕的上方为90°(逆时针)/-270°(顺时针);屏幕左侧为180°/-180°;屏幕下方为270° /-90°。

(逆时针:右-上-左-下方向 0°、90°、180°、270°)

在这里插入图片描述

对应的函数有:

  • turtle.setheading(angle) 设置朝向,但不前进

3.3 相关函数

turtle.goto(x, y)

作用:让小海龟直线前进到指定坐标。

参数: (x, y)为目标位置的 x 坐标和y 坐标。

turtle.forward(a)

作用:让小海龟 向前 移动a 个像素。

参数:a 代表的是移动的像素数。

turtle.backward(a)

作用:让小海龟 向后 移动a 个像素。

参数:a 代表的是移动的像素个数。

turtle.left(angle)

作用:让小海龟 向左 转 angle 角度。

参数:angle 代表旋转的角度。

特别说明: 参数为整数,代表 右转;为负数,代表左转。

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

作用:绘制圆或圆弧

参数:

  • radius — 代表的是半径,这个参数必须有;
  • extent — 代表的是弧度,如果没有给定参数,默认为360°;
  • steps — 代表绘制圆或圆弧所需要的边的数量。

特别说明:

  • (1)turtle.circle()中的参数,半径参数为必需的给定,弧度和边数参数是可以选择设定。注意:如果确定了变数参数值,则有两种方法表示:turtle.circle(80, 360, 4) turtle.circle(80, steps = 4)
  • (2)正多边形的绘制:turtle.circle()可以绘制正多边形,但是要注意:1.绘制正多边形时,turtle.circle()三个参数要完整,都要给定;2.正多边形的边长并不是半径也不是直径,如果不完整,需要按照语法格式补全参数。

示例程序:

import turtle
turtle.color('red')        # 设置画笔颜色和填充颜色都为红色
turtle.pensize(5)          # 设置画笔为5个像素

turtle.circle(100, 360)     # 画圆

turtle.penup() # 抬笔 不绘制线条
turtle.goto(200, 0)# 移动画笔到画布上此坐标
turtle.pendown() # 落笔 开始绘制

turtle.circle(100, 360, 6)   # 绘制 正六边形
#turtle.circle(100, 360, steps=6)

turtle.hideturtle()     # 隐藏小海龟的形状
turtle.done()           # 防止画布一闪而过

输出效果:

在这里插入图片描述

turtle.setheading(angle)

作用:让小海龟转到指定的绝对角度,该函数和前面的 turtle.left(angle)以及turtle.right(angle)最大的不同在于,该函数指转到指定角度,与之前画笔所朝向的方向没有任何关系。

参数:angle 为必需有的参数,代表旋转的绝对角度,参数可以为负数。

特别说明:turtle.setheading()可以简写为 `turtle.seth()。

turtle.speed(a)

作用:设定画笔的运动速度。

参数:a 的数值范围是 0~10 ,数字越大,速度越快,但是最快的是0 而不是10,因为当参数为0 时,turtle 绘图不需要动画。

turtle.dot(size=None, *color)

作用:绘制一个直径为size ,颜色为 color 的圆点。

参数:

  • size — 一个整型数 >= 1 (如果指定);若size 未指定,则直径取pensize+4 和 2* pensize中较大值。
  • color — 一个颜色字符串或者RGB颜色数值元组

特别说明: a 为圆点的直径,单位为像素。

turtle.home()

作用: 让小海龟返回原点

特别说明: 小海龟返回原点(0, 0)后,方向为初始方向,即屏幕的右方,但是画笔的颜色等设置依然保留。

易错点

-(1)turtle.dot()的参数为直径,而turtle.circle()的参数为半径。
-(2)turtle.seth()的参数为绝对角度,而turtle.left()turtle.right()的参数为相对角度
-(3)turtle.speed() 的参数范围为0~10 ,最快的是 0 ,最慢的是1 。

4. 其他函数

turtle.rest()

作用:清空画布,并且重置turtle 状态为初始状态

turtle.clear()

作用:清空turtle 窗口,但是turtle 的位置和状态不会改变。

注意turtle.rest()turtle.clear() 有着本质的区别:前者是完全初始化,画笔的所有设置均恢复到初始状态,但不包括画布的设置(比如画布的大小、画布的背景颜色等);而后者只轻触画布上的图案,并不改变画笔的设置和位置。

turtle.clone()

作用:创建并返回一个 turtle 的克隆体,该克隆体与 turtle 具有相同的属性。

turtle.stamp()

作用:印章,将小海龟的形状或者绘制的形状作为印章复制到屏幕上,和Scratch中的的印章作用一致。

turtle.screensize(canvwidth, canvheight, bg)

作用:设定画布的尺寸和背景颜色。

参数:一共有3个,前面两个参数设置画布的宽度和高度,第三个参数设定背景颜色。

说明:如果没有参数,则返回当前窗口的宽度和高度。

turtle.mainloop() 和 turtle.done()

作用: 停止画笔绘制,但是窗口不会关闭。由于这是用来停止画笔的,所以必须用在程序的中的最后一个语句。

示例程序:

import turtle

turtle.shape("square")

turtle.home()   # 返回原点
turtle.dot()    # 画点
turtle.stamp()  # 印章

turtle.forward(100)
turtle.setheading(90) # 设置朝向
turtle.stamp()

turtle.forward(100)
turtle.left(90)
turtle.stamp()

turtle.forward(100)
turtle.left(90)
turtle.stamp()

turtle.forward(100)

turtle.done()  # 防止画布一闪而过

输出效果:

在这里插入图片描述


练习

绘制下图。

在这里插入图片描述

(1)画一个有两个直角三角形组成的正方形,边长为180像素。
(2)左上三角形填充为黄色,右下三角形填充为红色。
(3)设置笔画移动速度为1,线条颜色为黑色。
(4)画图结束,隐藏并停止画笔。

示例程序:

import turtle
turtle.speed(1)
turtle.color('black', 'red')    # 设置画笔为黑色,填充颜色为红色
# turtle.fillcolor('red')
turtle.begin_fill()             # 开始填充
turtle.right(90)
turtle.forward(180)
turtle.right(90)
turtle.forward(180)
turtle.goto(0, 0)
turtle.end_fill()               # 结束填充

turtle.color("black", "yellow")
turtle.begin_fill()
turtle.setheading(0)  # 绝对方向 0°, 电脑屏幕正右方
turtle.backward(180)
turtle.right(90)
turtle.forward(180)
turtle.goto(0, 0)
turtle.end_fill()

turtle.hideturtle()     # 隐藏画笔/海龟
turtle.done()           # 防止画布一闪而过

输出效果:

在这里插入图片描述


参考资料

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐