Day21 · Turtle 入门与基础绘图
阶段:阶段一 · 核心基础 | 前置:Day20(面向对象) | 技术基准:Python 3.15.0
学习目标
- 学会导入标准库
turtle,用turtle.Turtle()创建一只"海龟"画笔 - 理解 Turtle 窗口的直角坐标系:原点 (0, 0)、x 轴向右为正、y 轴向上为正
- 掌握基本移动命令
forward/backward/left/right与坐标定位goto/setx/sety - 会用
penup/pendown/pensize/pencolor/speed控制画笔状态 - 认识
circle/dot画圆与画点,学会用color/fillcolor/begin_fill/end_fill给图形填色 - 弄清收尾函数
turtle.done()与turtle.exitonclick()的区别,让窗口行为可控
一、turtle 是什么
前面我们学完了面向对象(Day19、Day20),一直和文字输出打交道。今天换个口味:用 Python 自带的 turtle(小海龟)模块在窗口里画图。
turtle 是 Python 标准库内置的,不需要 pip install ,import turtle 就能用。它的隐喻很形象:想象一只小海龟趴在窗口中央,尾巴蘸着墨水,你命令它"往前走多少步、转多少度",它走过的路线就留在画布上,变成线条。
1.1、导入模块与创建海龟
标准写法分两步:先 import turtle,再用 turtle.Turtle() 创建一个海龟对象(这正是 Day19 学的"类 + 实例"):
python
import turtle
# 创建一只海龟画笔,默认出现在窗口正中央,朝右
t = turtle.Turtle()
t.forward(100) # 让它向前走 100 像素
turtle.done() # 收尾:把窗口留住(第八节细讲)
小嘉提醒:本课程约定把海龟实例命名为
t(短、好敲),后续所有示例都沿用这个名字。你也可以创建多只海龟,每只各走各的线,今天先从一只开始。
1.2、创建画布窗口 Screen
turtle 第一次被调用时会自动弹出一个默认窗口。想自定义窗口大小、标题、底色,可以先拿到 Screen 对象再设置:
python
import turtle
screen = turtle.Screen()
screen.setup(width=600, height=400) # 画布宽 600、高 400(像素)
screen.title("我的第一个 Turtle 窗口")
screen.bgcolor("#f5f5f5") # 浅灰底色,十六进制颜色串
t = turtle.Turtle()
t.forward(100)
turtle.done()
| Screen 常用方法 | 作用 |
|---|---|
screen.setup(width, height) |
设置画布宽高,也可再加 startx、starty 指定窗口位置 |
screen.title("文字") |
设置窗口标题栏文字 |
screen.bgcolor("颜色") |
设置画布背景色 |
screen.exitonclick() |
点击窗口即关闭(第八节讲) |
二、坐标系:海龟站在哪里
2.1、原点与四个方向
Turtle 采用标准直角坐标系,和数学课本里的平面直角坐标系一致:
- 原点 (0, 0) 在窗口正中央,海龟默认就站在这里。
- x 轴:向右为正方向,向左为负。
- y 轴:向上为正方向,向下为负。
- 海龟默认朝右(东) ,这个朝向称为航向(heading) ,角度为
0。逆时针旋转角度增加(左转为正),顺时针角度减小。
在交互模式下可以直接查看海龟当前位置与朝向:
python
import turtle
t = turtle.Turtle()
print(t.position()) # 输出:(0.00,0.00)
print(t.heading()) # 输出:0.0(默认朝右)
2.2、角度约定
| 朝向 | heading 角度 |
|---|---|
| 右(东) | 0° |
| 上(北) | 90° |
| 左(西) | 180° |
| 下(南) | 270°(或 -90°) |
小嘉提醒:Turtle 的坐标系和多数屏幕绘图库"左上角为原点、y 向下"不同,它是 y 向上的数学坐标系,画图时心里要先有这把尺子,别把上下搞反。
三、基本移动:forward / backward / left / right
3.1、前进与后退
| 方法 | 别名 | 作用 |
|---|---|---|
t.forward(距离) |
t.fd(距离) |
沿当前朝向前进 |
t.backward(距离) |
t.bk(距离) / t.back(距离) |
沿当前朝向倒退,朝向不变 |
注意:backward 不会先转身,而是"背对着走",所以它画的线方向与当前朝向相反,但海龟脸还是朝着原来的方向。
3.2、左转与右转
| 方法 | 别名 | 作用 |
|---|---|---|
t.left(角度) |
t.lt(角度) |
逆时针左转指定角度 |
t.right(角度) |
t.rt(角度) |
顺时针右转指定角度 |
下面这段代码走一个"L"形折线,先向前、再左转 90° 向上:
python
import turtle
t = turtle.Turtle()
t.forward(150) # 向右走 150
t.left(90) # 原地左转 90°,脸朝上
t.forward(120) # 向上走 120
t.backward(60) # 倒退 60(脸仍然朝上,线往下退)
t.right(90) # 右转 90°,脸朝右
t.forward(80)
turtle.done()
小嘉提醒:
left/right只改变朝向,不画线 ;真正留下轨迹的是forward/backward/goto。先转身再迈步,和人走路是一个道理。
四、坐标定位:goto / setx / sety
"相对行走"(前进、转弯)适合画连续线条;如果想直接把海龟送到某个具体坐标,就用"绝对定位"。
| 方法 | 作用 |
|---|---|
t.goto(x, y) |
直接移动到坐标 (x, y)(也可写 t.setpos(x, y) / t.setposition(x, y)) |
t.setx(x) |
只修改 x 坐标,y 保持不变 |
t.sety(y) |
只修改 y 坐标,x 保持不变 |
t.position() / t.pos() |
读取当前坐标(返回一个二元组) |
python
import turtle
t = turtle.Turtle()
t.pensize(2)
# 先抬笔飞到 (-150, 100),不画线
t.penup()
t.goto(-150, 100)
t.pendown()
t.goto(150, 100) # 画一条水平线到右上角附近
t.goto(0, -150) # 再画斜线到下方
t.setx(150) # x 改成 150,y 仍为 -150(画水平线)
turtle.done()
小嘉提醒:
goto是"直线瞬移过去",移动路径会被画出来。想不画线地换位置,必须先penup()(抬笔),到地方再pendown()(落笔)------这就是下一节的内容。
五、画笔控制
5.1、抬笔与落笔
| 方法 | 别名 | 作用 |
|---|---|---|
t.penup() |
t.up() / t.pu() |
抬起画笔,之后移动不画线 |
t.pendown() |
t.down() / t.pd() |
放下画笔,之后移动恢复画线 |
5.2、笔宽、颜色与速度
| 方法 | 作用 |
|---|---|
t.pensize(宽度) / t.width(宽度) |
设置线条粗细(像素),默认 1 |
t.pencolor("颜色") |
设置画笔(线条)颜色 |
t.speed(n) |
设置绘制速度,取值 0~10,见下表 |
速度等级:
speed(n) |
效果 |
|---|---|
| 1 | 最慢,一步一步走,适合观察过程 |
| 3~6 | 普通速度,默认约为 3 |
| 10 | 快 |
| 0 | 最快,直接闪现,不做动画 |
颜色可以用英文颜色名("red"、"blue"、"gold"),也可以用十六进制串("#3a7bd5")。下面画两条不同粗细、不同颜色的线,中间用抬笔跳过空隙:
python
import turtle
t = turtle.Turtle()
t.speed(5)
# 第一条:粗蓝线
t.pensize(4)
t.pencolor("blue")
t.penup()
t.goto(-150, 50)
t.pendown()
t.forward(300)
# 抬笔走到第二条起点,中间不画线
t.penup()
t.goto(-150, -50)
t.pendown()
# 第二条:细灰线
t.pensize(1)
t.pencolor("gray")
t.forward(300)
turtle.done()
六、circle 与 dot:画圆和画点
6.1、t.circle(半径, 角度=None)
t.circle(r) 以海龟当前位置为"圆周上的一点",向左转一个半径 为圆心,逆时针画一个整圆。circle(r, 180) 则只画 180° 的半圆(圆弧)。
python
import turtle
t = turtle.Turtle()
t.pensize(2)
t.circle(60) # 半径 60 的整圆
t.penup()
t.goto(0, -120)
t.pendown()
t.circle(40, 180) # 半径 40 的上半圆
turtle.done()
6.2、t.dot(直径, 颜色=None)
dot 直接在当前位置画一个实心圆点,不需要移动:
python
import turtle
t = turtle.Turtle()
t.dot(30, "red") # 直径 30 的红点
t.penup()
t.goto(80, 0)
t.pendown()
t.dot(20, "gold") # 直径 20 的金点
turtle.done()
小嘉提醒:
circle的圆心在海龟左侧(半径方向垂直于当前朝向),所以刚画完一个圆,海龟还在原来的起点上、朝向不变;想换位置画第二个圆,记得先penup()再goto。
七、颜色与填充
7.1、color、pencolor、fillcolor
| 方法 | 作用 |
|---|---|
t.pencolor("颜色") |
只设线条颜色 |
t.fillcolor("颜色") |
只设填充颜色 |
t.color("线条色", "填充色") |
一次同时设置两者;只传一个参数则两者都设为该色 |
7.2、begin_fill() 与 end_fill()
给闭合图形填色的固定套路:先 begin_fill(),再沿着图形边界画一圈(路径要闭合),最后 end_fill(),中间围起来的区域就被填充色铺满:
python
import turtle
t = turtle.Turtle()
t.pensize(2)
t.color("black", "gold") # 黑线、金填充
t.begin_fill() # 准备填充
for _ in range(4): # (for 循环 Day22 细讲,这里先看效果)
t.forward(100)
t.left(90)
t.end_fill() # 结束填充,正方形被金色铺满
turtle.done()
7.3、完整小例:一座小房子
把今天学的移动、抬笔、定位、填充串起来,画一座带屋顶的小房子(墙体用手动走四条边,先不依赖循环):
python
import turtle
def draw_house():
t = turtle.Turtle()
t.speed(3)
t.pensize(2)
# 墙体:正方形,浅米色填充
t.color("black", "#ffd9a0")
t.begin_fill()
t.forward(120)
t.left(90)
t.forward(120)
t.left(90)
t.forward(120)
t.left(90)
t.forward(120)
t.left(90)
t.end_fill()
# 屋顶:三角形,砖红色填充
t.penup()
t.goto(-20, 120)
t.setheading(0)
t.pendown()
t.color("black", "#e06666")
t.begin_fill()
t.goto(60, 210)
t.goto(140, 120)
t.goto(-20, 120)
t.end_fill()
t.hideturtle() # 画完把海龟箭头藏起来
if __name__ == "__main__":
draw_house()
turtle.done()
本机运行方式(在脚本所在目录打开命令行):
powershell
py -3 house.py
八、收尾:done() 与 exitonclick() 的区别
turtle 的窗口是一个常驻图形窗口,脚本跑完后如果不收尾,窗口可能一闪而过。标准的收尾写法有两种,行为不同:
python
import turtle
t = turtle.Turtle()
t.forward(100)
# 方式一:turtle.done()
# 程序停在这一行,窗口一直保持打开,由你手动点右上角叉号关闭;
# 关闭后脚本才真正结束。适合慢慢欣赏成果。
turtle.done()
# 方式二:turtle.exitonclick()
# 绘制完成后,等待你在窗口里点击鼠标,点一下窗口自动关闭。
# 适合"点一下就走"的小演示。
# turtle.exitonclick()
| 收尾方式 | 窗口行为 | 适用场景 |
|---|---|---|
turtle.done() |
一直挂着,手动点叉关闭 | 默认、最稳妥,保存成果慢慢看 |
turtle.exitonclick() |
等待一次鼠标点击后自动关闭 | 交互演示,点一下即走 |
turtle.bye() |
立即关闭窗口、结束事件循环 | 自动化测试、批量出图(本课验证用) |
8.1、tracer(0) 加速:跳过动画
默认 turtle 会一步一步动画演示绘制过程,图形复杂时很慢。调用 turtle.tracer(0) 关闭逐帧刷新,画完再 turtle.update() 一次性显示:
python
import turtle
turtle.tracer(0) # 关闭动画刷新,所有绘制先在后台完成
t = turtle.Turtle()
# ...这里写一堆绘制命令...
turtle.update() # 一次性把画面推到屏幕上
turtle.done()
小嘉提醒:
tracer(0)之后必须调用update()才会看到画面,否则窗口可能一片空白,这是新手最常踩的坑。
练习题
- 创建一个 500×400 的窗口,标题为"我的画板",背景色为
#eef5ff,让海龟向前走 100、左转 90° 再走 100。 - 用
goto画出一个等腰三角形的三条边(自己选三个坐标点),要求起点之间用抬笔移动,不要出现多余连线。 - 画两条平行线:一条粗 5、颜色
"green";另一条粗 2、颜色"orange",两条线之间留 40 像素空隙。 - 用
circle(50)画一个圆,再用dot(15, "white")在圆心上画一个白点,圆心位置自行用penup+goto对准。 - 用
begin_fill()/end_fill()画一个填充色为"lightblue"的正方形(边长 100),边框为深蓝色。 - 思考题:
backward(100)与left(180)后再forward(100)画出来的线位置一样吗?海龟的朝向有什么区别?动手试试并解释。
小结
import turtle后用t = turtle.Turtle()创建海龟;Screen对象负责窗口大小、标题、底色。- 坐标系:原点在窗口中央,x 向右为正、y 向上为正,默认朝右(0°)。
- 相对移动:
forward/backward走路,left/right转身;绝对定位:goto/setx/sety。 - 画笔:
penup抬笔不画线、pendown落笔画线,pensize控粗细、pencolor控色、speed控速度。 - 形状:
circle(半径)画圆(圆心在左侧),dot(直径, 颜色)画实心点。 - 填充:
begin_fill()起、end_fill()止,中间路径闭合即被fillcolor铺满。 - 收尾:
done()挂起等手动关闭,exitonclick()点一下关闭;tracer(0)+update()可关闭动画加速出图。
扩展阅读
- 官方 turtle 文档(中文):https://docs.python.org/zh-cn/3/library/turtle.html
- 官方图形教程(Turtle 部分):https://docs.python.org/3/tutorial/introduction.html#first-steps-towards-programming
- 颜色转换工具 colorsys(rgb/hsv 互转参考):https://docs.python.org/3/library/colorsys.html