用 Python Turtle 练熟移动、填色与循环绘图

2026-10-02 33 预计阅读时间: 1 分钟
来源: realpython.com AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:7 分钟

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

这个例子同时练习了:

  1. 用 forward() 和转向方法控制路径;
  2. 用循环减少重复代码;
  3. 用 penup() 和 pendown() 实现无痕移动;
  4. 用 color()、begin_fill() 和 end_fill() 填充图形;
  5. 用 goto() 精确定位,用 setheading() 重设方向。

10 道题检查是否掌握

尝试先不运行代码,直接判断答案。

  1. forward(50) 会改变 Turtle 的位置还是方向?
  2. 连续执行四次 forward(100) 能否自动画出正方形?
  3. 正五边形每次应转动多少度的外角?
  4. penup() 之后执行 goto(100, 100) 会不会留下线条?
  5. pencolor('red') 会不会自动把图形内部填成红色?
  6. 哪两个方法标记填充区域的开始和结束?
  7. range(6) 会让循环体执行多少次?
  8. 为什么正三角形循环中的转角是 120 度,而不是 60 度?
  9. setheading(90) 通常会让 Turtle 朝向哪个方向?
  10. 为什么程序末尾需要 turtle.done() 或 screen.mainloop()?

参考答案:

  1. 改变位置,方向不变。
  2. 不能,还需要在每条边之后转向。
  3. 360 / 5 = 72 度。
  4. 不会,因为画笔处于抬起状态。
  5. 不会,它只改变轮廓线颜色。
  6. begin_fill() 和 end_fill()。
  7. 6 次。
  8. 这里使用的是外角;正三角形的外角是 120 度。
  9. 向上,也就是坐标系中的正 Y 方向。
  10. 让图形窗口继续处理事件并保持显示。

从临摹图形过渡到自己设计

掌握基础 API 后,不要只重复固定图案。可以按下面的顺序改造示例:

  • 把正方形函数抽象为 draw_polygon(sides, length);
  • 接收颜色、边数和边长作为参数;
  • 用嵌套循环绘制多个旋转后的多边形;
  • 在每轮循环中改变颜色,生成简单的几何花纹;
  • 使用 penup() 与 goto() 把多个图形排成网格。

需要注意,Turtle 依赖图形窗口。在无桌面的服务器、部分在线解释器或未提供 Tk 图形支持的 Python 环境里,窗口可能无法打开。更适合在本地桌面 Python 环境中练习;如果遇到 _tkinter 相关错误,应先检查当前 Python 是否安装了 Tk 支持。

真正需要掌握的不是记住每个函数名,而是建立“移动—转向—重复—填充”的思维模型。只要能把目标图形拆成这些动作,就能从正方形逐步画出房屋、星形和更复杂的组合图案。


相关推荐