Python 的 turtle 模块把编程指令变成直观的绘图动作:让画笔前进、转弯、改变颜色,再用循环重复这些动作。对于刚接触 Python 的开发者,它能把变量、函数和循环这些抽象概念变成看得见的结果。
下面通过一个可直接运行的小项目,串起 Turtle 绘图最常用的操作,并用 10 道题检查你是否真正理解了代码。
画笔移动其实是在更新位置和方向
Turtle 可以理解为画布上的一支“有方向的笔”。最基本的指令分为三类:
forward(distance):沿当前方向前进。backward(distance):沿当前方向后退。left(angle)、right(angle):旋转指定角度。
例如,正方形由四条等长的边和四次 90 度转向组成:
import turtle
pen = turtle.Turtle()
for _ in range(4):
pen.forward(100)
pen.right(90)
turtle.done()
这里的 _ 表示循环变量不会在循环体内使用。range(4) 让同一组动作执行四次,避免复制四遍相同代码。
角度决定了图形能否闭合。绘制正多边形时,每次转动的外角可以按下面的公式计算:
外角 = 360 / 边数
因此,正三角形每次转 120 度,正六边形每次转 60 度。
抬笔、落笔与颜色各管什么
移动 Turtle 不一定要留下线条。penup() 会抬起画笔,之后的移动只改变位置;pendown() 则恢复绘制。
颜色也分为两个概念:
pencolor()设置轮廓线颜色。fillcolor()设置封闭区域的填充色。color(outline, fill)可以同时设置两者。
填充图形时,必须把绘图动作放在 begin_fill() 和 end_fill() 之间:
pen.color('navy', 'skyblue')
pen.begin_fill()
for _ in range(4):
pen.forward(100)
pen.right(90)
pen.end_fill()
如果只调用 fillcolor(),却没有调用填充开始和结束方法,图形通常只会显示轮廓,不会自动填色。
可运行示例:画一座彩色小房子
将下面内容保存为 turtle_house.py。运行前可以修改 wall_size、wall_color 和 roof_color,观察尺寸与颜色如何影响结果。
import turtle
screen = turtle.Screen()
screen.title('Python Turtle House')
screen.bgcolor('white')
pen = turtle.Turtle()
pen.speed(5)
pen.pensize(3)
wall_size = 180
wall_color = 'lightyellow'
roof_color = 'tomato'
# 绘制并填充正方形墙体
pen.color('black', wall_color)
pen.begin_fill()
for _ in range(4):
pen.forward(wall_size)
pen.left(90)
pen.end_fill()
# 移动到墙体左上角,期间不画线
pen.penup()
pen.goto(0, wall_size)
pen.pendown()
# 绘制并填充三角形屋顶
pen.color('black', roof_color)
pen.begin_fill()
for _ in range(3):
pen.forward(wall_size)
pen.left(120)
pen.end_fill()
# 移动到门的位置
pen.penup()
pen.goto(65, 0)
pen.setheading(90)
pen.pendown()
# 绘制门
pen.color('saddlebrown', 'burlywood')
pen.begin_fill()
for length in (80, 50, 80, 50):
pen.forward(length)
pen.right(90)
pen.end_fill()
pen.hideturtle()
screen.mainloop()
在带有图形桌面的 Python 环境中运行:
python turtle_house.py
这个例子同时练习了:
- 用
forward()和转向方法控制路径; - 用循环减少重复代码;
- 用
penup()和pendown()实现无痕移动; - 用
color()、begin_fill()和end_fill()填充图形; - 用
goto()精确定位,用setheading()重设方向。
10 道题检查是否掌握
尝试先不运行代码,直接判断答案。
forward(50)会改变 Turtle 的位置还是方向?- 连续执行四次
forward(100)能否自动画出正方形? - 正五边形每次应转动多少度的外角?
penup()之后执行goto(100, 100)会不会留下线条?pencolor('red')会不会自动把图形内部填成红色?- 哪两个方法标记填充区域的开始和结束?
range(6)会让循环体执行多少次?- 为什么正三角形循环中的转角是 120 度,而不是 60 度?
setheading(90)通常会让 Turtle 朝向哪个方向?- 为什么程序末尾需要
turtle.done()或screen.mainloop()?
参考答案:
- 改变位置,方向不变。
- 不能,还需要在每条边之后转向。
360 / 5 = 72度。- 不会,因为画笔处于抬起状态。
- 不会,它只改变轮廓线颜色。
begin_fill()和end_fill()。- 6 次。
- 这里使用的是外角;正三角形的外角是 120 度。
- 向上,也就是坐标系中的正 Y 方向。
- 让图形窗口继续处理事件并保持显示。
从临摹图形过渡到自己设计
掌握基础 API 后,不要只重复固定图案。可以按下面的顺序改造示例:
- 把正方形函数抽象为
draw_polygon(sides, length); - 接收颜色、边数和边长作为参数;
- 用嵌套循环绘制多个旋转后的多边形;
- 在每轮循环中改变颜色,生成简单的几何花纹;
- 使用
penup()与goto()把多个图形排成网格。
需要注意,Turtle 依赖图形窗口。在无桌面的服务器、部分在线解释器或未提供 Tk 图形支持的 Python 环境里,窗口可能无法打开。更适合在本地桌面 Python 环境中练习;如果遇到 _tkinter 相关错误,应先检查当前 Python 是否安装了 Tk 支持。
真正需要掌握的不是记住每个函数名,而是建立“移动—转向—重复—填充”的思维模型。只要能把目标图形拆成这些动作,就能从正方形逐步画出房屋、星形和更复杂的组合图案。