Python Turtle 绘图入门到进阶

Turtle 图形是 Python 内置的「交互式绘图玩具库」,源自 1966 年 Seymour Papert 和 Wally Feurzig 为 LOGO 语言设计的编程学习工具。它通过控制一个虚拟的「带画笔的小海龟」在屏幕上移动来绘制图形——既可以作为零基础入门编程的桥梁,也能用来玩分形、几何艺术甚至简单的互动小游戏。

1. 从零开始:基础绘图操作

1.1 先画个带彩色边的长方形热热身

先运行一段最直观的代码,熟悉 turtle 最核心的几个命令:

from turtle import *

# 初始化画布和画笔配置
setup(600, 400)  # 弹出宽600px、高400px的窗口
width(4)         # 画笔线条粗细设为4
speed(3)         # 绘制速度调为3(适中)

# 逐边绘制彩色长方形
pencolor('red')   # 第一条边:红色
forward(200)      # 小海龟前进200像素
right(90)         # 原地向右转90度

pencolor('green') # 第二条边:绿色
forward(100)
right(90)

pencolor('blue')  # 第三条边:蓝色
forward(200)
right(90)

pencolor('black') # 第四条边:黑色
forward(100)

done()  # 绘制完成后保持窗口不关闭

1.2 常用命令速查表

把刚才用到和未来高频用的命令整理成表格,方便随时查阅:

命令说明示例代码
forward(distance) / fd(d)小海龟向当前朝向前进指定像素fd(100)
backward(distance) / bk(d)小海龟向当前朝向的反方向后退指定像素bk(50)
right(angle) / rt(a)原地向右转指定角度rt(90)
left(angle) / lt(a)原地向左转指定角度lt(45)
penup() / pu()抬起画笔,移动时不留下痕迹pu()
pendown() / pd()放下画笔,移动时开始画线pd()
pencolor(color) / pencolor(r,g,b)设置画笔颜色(支持英文/十六进制/RGB)pencolor('skyblue')
fillcolor(color)设置填充颜色(需和begin_fill()/end_fill()配合)fillcolor('yellow')
width(size) / pensize(s)设置画笔线条粗细pensize(6)
speed(s)绘制速度:0最快/1-10递增(默认6)speed(0)
goto(x,y)直接移动到画布指定坐标(原点在中间)goto(0, -100)
setheading(angle) / seth(a)重置小海龟朝向(0向右/90向上/180向左/270向下)seth(90)

2. 提升效率:循环与递归画复杂图形

2.1 用循环画一排整齐的五角星

逐行重复写 5 次绘制角的代码太麻烦了,用 for 循环优化成通用函数:

from turtle import *

def draw_star(x, y, size=40):
    """在(x,y)坐标处画指定大小的五角星"""
    penup()
    goto(x, y)
    pendown()
    
    setheading(0)  # 先把小海龟朝向右边
    for _ in range(5):
        forward(size)
        right(144)  # 五角星外角度数固定144°

# 画从左到右的9个五角星(间距50px)
title("一排小五角星")
for x_pos in range(-200, 250, 50):
    draw_star(x_pos, 0, size=30)

done()

2.2 用递归画一棵渐变分形树

分形是 turtle 的经典玩法,递归能完美实现「自相似结构」的树枝:

from turtle import *
import random

# 初始化配置(先运行配置再画图)
colormode(255)  # 切换到RGB颜色模式(0-255)
speed(0)        # 最快绘制速度
left(90)        # 小海龟初始朝上
penup()
goto(0, -180)   # 把树干底部移到画布下方
pendown()

# 分形树核心参数
TREE_LEVELS = 10    # 递归深度(越深越密,别超过15)
BRANCH_LENGTH = 80  # 初始树干长度
BRANCH_ANGLE = 25   # 左右分支的基础夹角

def draw_branch(length, level):
    """递归绘制树枝的函数"""
    if level > TREE_LEVELS:
        return
    
    # 树枝宽度和颜色随深度变化:越往上越细越浅
    width(TREE_LEVELS - level + 1)
    green_level = 255 // TREE_LEVELS * level
    pencolor(0, green_level, 0)
    
    forward(length)
    
    # 先画右分支,再画左分支,最后退回去
    right(BRANCH_ANGLE + random.randint(-5, 5))  # 加随机角度让树更自然
    draw_branch(length * 0.75, level + 1)
    
    left(BRANCH_ANGLE * 2 + random.randint(-5, 5))
    draw_branch(length * 0.75, level + 1)
    
    right(BRANCH_ANGLE + random.randint(-5, 5))
    backward(length)

# 开始绘制
title("带随机感的渐变分形树")
draw_branch(BRANCH_LENGTH, 1)
hideturtle()  # 画完把小海龟藏起来更美观

done()

3. 进阶玩法:面向对象、事件与动画

原代码大多用了全局函数风格,但现代 Python 更推荐面向对象(OO)风格——能避免多个海龟同时绘图时的冲突,也更符合工程化代码习惯。

3.1 OO 风格画彩色螺旋

from turtle import Turtle, Screen

def main():
    # 1. 创建独立的画布和海龟对象
    screen = Screen()
    screen.setup(800, 600)
    screen.title("OO风格彩色螺旋")
    screen.bgcolor("#f0f8ff")  # 淡蓝色背景
    
    spiral_turtle = Turtle()
    spiral_turtle.shape("turtle")  # 把画笔图标换成可爱的小海龟
    spiral_turtle.color("purple")
    spiral_turtle.speed(0)
    spiral_turtle.pensize(2)
    
    # 2. 绘制彩色螺旋(颜色循环+角度微调制造缠绕感)
    colors = ['#ff4757', '#ffa502', '#2ed573', '#1e90ff', '#a55eea', '#ff6b81']
    for i in range(120):
        spiral_turtle.color(colors[i % 6])
        spiral_turtle.forward(i * 3)
        spiral_turtle.right(92)  # 比90°多2°,螺旋不会重叠
    
    spiral_turtle.hideturtle()
    screen.mainloop()

if __name__ == "__main__":
    main()

3.2 事件驱动:用键盘控制小海龟

除了自动绘图,turtle 还支持简单的按键交互

from turtle import Turtle, Screen

def move_forward():
    artist.forward(15)

def move_backward():
    artist.backward(15)

def turn_left():
    artist.left(20)

def turn_right():
    artist.right(20)

def clear_canvas():
    artist.clear()
    artist.penup()
    artist.home()
    artist.pendown()

def toggle_pen():
    if artist.isdown():
        artist.penup()
    else:
        artist.pendown()

# 初始化画布和海龟
screen = Screen()
screen.title("键盘控制的小画板")
screen.setup(700, 500)

artist = Turtle()
artist.shape("turtle")
artist.color("darkgreen")
artist.speed(5)

# 绑定按键与对应函数
screen.onkey(move_forward, "Up")
screen.onkey(move_backward, "Down")
screen.onkey(turn_left, "Left")
screen.onkey(turn_right, "Right")
screen.onkey(clear_canvas, "c")
screen.onkey(toggle_pen, "space")

screen.listen()  # 关键一步:让画布开始监听键盘输入
screen.mainloop()

4. 新手必踩坑与最佳实践

4.1 避坑指南

  1. 忘记 done()mainloop():如果是全局函数,要用 done();如果是 OO 风格用 Screen().mainloop(),否则窗口会闪退。
  2. 坐标原点搞反:turtle 的坐标原点在画布正中间,不是左上角(和大部分图形库不一样)。
  3. 递归深度过大:分形树/雪花这类递归图形,别把深度设超过 15,否则会报错 RecursionError
  4. 多个海龟冲突:用全局函数时要小心,尽量用 OO 风格创建独立的 Turtle 实例。

4.2 最佳实践

  1. 模块化代码:把复杂图形(比如花朵、树)封装成函数,方便复用。
  2. 关闭自动刷新加速:画复杂图形时,用 screen.tracer(0) 关闭自动刷新,画完后手动 screen.update()
  3. try-finally 收尾:确保无论代码是否报错,窗口都能正常关闭或进入循环。
  4. 添加 hideturtle():画完后把小海龟藏起来,图形更整洁。

5. 推荐学习资源

  1. Python 官方 turtle 文档:最全最权威的参考手册。
  2. Michael0x2a 的 Turtle 示例库:有大量酷炫的图形代码。
  3. Real Python 的 Turtle 入门指南:图文并茂,适合完全零基础的人。

Turtle 虽然简单,但上限不低——你可以用它练循环、递归、面向对象,甚至开发简单的贪吃蛇、打砖块游戏。快打开你的 Python 编辑器试试吧!