最近博主在 CSDN 上看到许多关于海龟画图的案例,如画圣诞树、五角星等,但是都是直接给出了源码以及一些简单的注释,没有对其详细的说明,会让很多初学者迷糊很久,故这里博主详细地对 turtle 模块中的方法进行详解,让广大博友能够做到自由画图。
海龟绘图是 Python 内置的一个比较有趣的模块,模块名称为 turtle。它最初源于 20世纪60年代 的 Logo 语言,之后成为了 Python 的内置模块。海龟绘图提供了一些简单的绘图方法,可以根据编写的控制指令(代码),让一个 “海龟” 在屏幕上来回移动,而且可以在它爬行的路径上绘制图形。通过海龟绘图,不仅可以在屏幕上绘制图形,还可以看到整个绘制过程。另外,海龟绘图对初学者十分友好,它能够轻松地编写出很多有趣的实例。
在窗口中,坐标原点(0,0) 的位置默认有一个指向 x 轴正方向的箭头(或小乌龟),这就相当于我们的画笔。在海龟绘图中,通过画笔可以控制线条的粗细、颜色、运动的速度以及是否显示光标等样式。下面分别进行介绍。
在海龟绘图中,默认的画笔形状为箭头,可以通过 shape() 方法修改为其他样式。shape() 方法的语法如下:
def shape(self, name=None)
其中,name 参数为可选参数,用于指定形状名,如没有指定形状名,则返回当前的形状名。常用的形状名有 arrow(向右的等腰三角形)、turtle(海龟)、circle(实心圆)、square(实心正方形)、triangle(向右的正三角形) 或 classic(箭头)等 6 种,如下图所示:
画笔的样式设置后,如果不改变为其他状态,那么会一直有效。例如,先获取当前的画笔形状,然后将画笔形状修改为实心圆,再获取画笔的形状,代码如下:
# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:3.设置画笔样式.py
@time:2020/12/29
"""
from turtle import * # 导入turtle的全部定义
print(f"修改前: {shape()}") # 获取当前的画笔形状
shape(name="circle") # 设置当前的画笔形状为实心圆
print(f"修改后: {shape()}") # 获取修改后的画笔形状
done() # 海龟绘图程序的结束语句(开始主程序)
程序运行结果如下:
在海龟绘图中,一个画笔形状会跟随海龟的光标移动。如果想要在海龟移动过的某个位置留下一个海龟形状,可以使用 stamp() 方法在当前光标处印制一个印章,该印章不会跟随海龟光标移动。例如,想要在当前光标位置印制一枚印章,可以使用下面的代码:
t = Pen()
stampid = t.stamp()
在海龟绘图中,画笔的默认颜色为黑色,可以使用 pencolor() 或者 color() 方法修改画笔的颜色。下面分别进行介绍。
pencolor() 方法:用于修改画笔的颜色,同时画笔形状会添加一圈所指定颜色的描述,但是内部还是默认的黑色。pencolor() 方法的语法如下:
def pencolor(self, *args)
args 参数为可变参数,可以是一个颜色字符串 (可以使用英文颜色或者十六进制颜色值,常用的颜色字符串如下图所示),也可以是三个取值范围在 0~cmode 之间的数值 (如 1.0,0.5,0.5,分别代表 r,g,b 的值),还可以是一个取值范围相同的包括 3 个数值元素 (取值范围在 0-~cmode) 的元组 (如(1.0,0.5,0.5),分别代表 r,g,b 的值)。关于颜色的具体取值请参见 全网最细海龟 (turtle) 画图讲解 (二):窗口控制 一文中的 1.3 设置窗口的背景颜色 小节。例如,使用 pencolor() 方法设置画笔颜色为红色,并且让海龟向前移动 100 像素,可以使用下面的代码:
# -*- coding: UTF-8 -*-
"""
@author:AmoXiang
@file:3.设置画笔样式.py
@time:2020/12/29
"""
import turtle # 导入海龟绘图模块
# turtle.pencolor("red")
# turtle.pencolor(1, 0, 0)
turtle.colormode(255) # 设置颜色模式
turtle.pencolor(255, 0, 0)
turtle.forward(100)
turtle.done() # 海龟绘图程序的结束语句(开始主程序)
color() 方法:用于获取或修改画笔的颜色,整个画笔的形状均为所设置的颜色。color() 方法的语法如下:
def color(self, *args)
args 参数值可以设置为与 pencolor() 方法的完全相同,这里将不再赘述。也可以设置两种颜色,分别用于指定轮廓颜色和填充颜色。例如,turtle.color("red", "yellow")
表示轮廓颜色为红色,填充颜色为黄色。例如,使用 color() 方法设置画笔颜色为红色,并且让海龟向前移动 100 像素,可以使用下面的代码:
import turtle # 导入海龟绘图模块
turtle.color("red")
turtle.forward(100)
turtle.done() # 海龟绘图程序的结束语句(开始主程序)
本小节我们先来画两条不同颜色的平行线。要实现该功能需要进行以下几步的操作:
设置画笔颜色 ⇒ 绘制第一条直线 ⇒ 向左旋转90° ⇒ 移动一段距离 ⇒ 再向左旋转90° ⇒ 设置画笔颜色 ⇒ 绘制第二条直线。
根据以上分析编写的代码如下:
import turtle # 导入海龟绘图模块
turtle.color("red")
turtle.forward(200) # 画一条红色的线
turtle.left(90)
turtle.forward(30) # 画一条红色的线
turtle.left(90)
turtle.color("green")
turtle.forward(200) # 画一条绿色的线
turtle.done() # 海龟绘图程序的结束语句(开始主程序)
程序运行结果如下:
从上图可以看出,并没实现想要的绘制两条平行线。这是因为在移动海龟时,默认会留下“足迹”。如果有时只想实现移动,而不想画线,那么需要设置画笔的抬起(简称抬笔)和落下(简称落笔)的状态。当抬笔时不画线,落笔时再画线。实现抬笔功能时,可以使用下面 3 种方法:
这三种方法的功能是一样的,使用哪种方法都可以。实现落笔功能时,可以使用下面 3 种方法:
首先导入海龟绘图模块,并且画一条红线,然后逆时针旋转 90 度,并且设置抬笔,再移动 30 像素,并且逆时针旋转 90 度,最后设置落笔,并且画一条绿色的线,代码如下:
import turtle # 导入海龟绘图模块
turtle.color("red")
turtle.forward(200) # 画一条红色的线
turtle.left(90)
turtle.penup()
turtle.forward(30) # 向上移动30像素
turtle.left(90)
turtle.pendown()
turtle.color("green")
turtle.forward(200) # 画一条绿色的线
turtle.done() # 海龟绘图程序的结束语句(开始主程序)
程序运行结果如下:
海龟绘图还提供了判断画笔是否落下的 turtle.isdown() 方法,当画笔落下时该方法返回 True,抬起时返回 False。例如,想要实现当画笔状态为落笔状态时设置为抬笔,可以使用下面的代码:
if turtle.isdown():
turtle.penup() # 抬笔
在海龟绘图中,默认的线条粗细为 1 像素。如果想改变线条粗细,可以通过以下两个方法中的任意一个实现:
turtle.pensize(width=None)
turtle.width(width=None)
其中,width 为可选参数,如果不指定,则获取当前画笔的粗细,否则使用设置的值改变画笔的粗细。例如,修改上面的实例,将第二条绿色的线的粗细设置 5 像素。修改后的代码如下:
import turtle # 导入海龟绘图模块
turtle.color("red")
turtle.forward(200) # 画一条红色的线
turtle.left(90)
turtle.penup() # 抬笔
turtle.forward(30) # 向上移动30像素
turtle.left(90)
turtle.pendown() # 落笔
turtle.width(5) # 设置线的粗细为5像素
turtle.color("green")
turtle.forward(200) # 画一条绿色的线
turtle.done() # 海龟绘图程序的结束语句(开始主循环)
修改后的程序运行效果如下图所示:
从上图中可以看出,设置线的粗细后,海龟的光标还是原来的大小,如果想要改变其大小,可以在设置线的粗细之前使用代码 turtle.resizemode("auto")
设置改变模式为自动。修改后的代码运行效果如下图所示。
在默认情况下采用海龟绘图时,会显示海龟光标。例如,已经通过 shape() 方法将当前的光标样式设置为 turtle(海龟)。那么在绘图时,可以看见屏幕上有一只缓慢爬行的小海龟。对于此种情况,在绘制复杂图形时,势必会影响速度。因此,海龟绘图提供了以下隐藏或显示海龟光标的方法。
例如,在默认情况下,让海龟向前爬行 100 像素,再隐藏海龟光标,并且让海龟向下爬行 100 像素,代码如下:
import turtle # 导入海龟绘图模块
turtle.shape("turtle") # 改变海龟光标的形状为海龟
turtle.forward(100) # 向前爬行100像素
turtle.right(90) # 顺时针旋转90度
turtle.hideturtle() # 隐藏海龟光标
turtle.forward(100) # 向下爬行100像素
turtle.done() # 海龟绘图程序的结束语句(开始主循环)
在海龟绘图时,默认是有绘制的动画效果的,并且速度的快慢可以通过 speed() 方法进行调整。speed() 方法的语法如下:
def speed(self, s=0):
其中,参数 speed 为可选参数,如果不指定,则获取当前的画笔速度。如果指定,需要将值设置为 0~10 之间的整数或速度字符串。速度字符串有 fastest (最快)、fast (快)、normal (正常)、slow (慢)、slowest (最慢)。当设置速度值时,0表示最快,1表示最慢,然后逐渐加快。
注意:speed=0 表示没有动画效果。forward()/back() 方法将使海龟向前 / 向后跳跃,同样的 left()/right() 方法将使海龟立即改变朝向。
例如,将画笔的速度设置为最快,代码如下:
turtle.speed(0) # 设置画笔的速度,0为最快
将画笔的速度设置为正常,代码如下:
turtle.speed(6) # 设置画笔的速度,6为正常