Day21 · Turtle 入门与基础绘图

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 学的"类 + 实例"):

import turtle

# 创建一只海龟画笔,默认出现在窗口正中央,朝右
t = turtle.Turtle()

t.forward(100)       # 让它向前走 100 像素

turtle.done()        # 收尾:把窗口留住(第八节细讲)

小嘉提醒:本课程约定把海龟实例命名为 t(短、好敲),后续所有示例都沿用这个名字。你也可以创建多只海龟,每只各走各的线,今天先从一只开始。

1.2、创建画布窗口 Screen

turtle 第一次被调用时会自动弹出一个默认窗口。想自定义窗口大小、标题、底色,可以先拿到 Screen 对象再设置:

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。逆时针旋转角度增加(左转为正),顺时针角度减小。

在交互模式下可以直接查看海龟当前位置与朝向:

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° 向上:

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() 读取当前坐标(返回一个二元组)
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")。下面画两条不同粗细、不同颜色的线,中间用抬笔跳过空隙:

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° 的半圆(圆弧)。

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 直接在当前位置画一个实心圆点,不需要移动:

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(),中间围起来的区域就被填充色铺满:

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、完整小例:一座小房子

把今天学的移动、抬笔、定位、填充串起来,画一座带屋顶的小房子(墙体用手动走四条边,先不依赖循环):

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()

本机运行方式(在脚本所在目录打开命令行):

py -3 house.py

八、收尾:done() 与 exitonclick() 的区别

turtle 的窗口是一个常驻图形窗口,脚本跑完后如果不收尾,窗口可能一闪而过。标准的收尾写法有两种,行为不同:

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() 一次性显示:

import turtle

turtle.tracer(0)       # 关闭动画刷新,所有绘制先在后台完成

t = turtle.Turtle()
# ...这里写一堆绘制命令...

turtle.update()        # 一次性把画面推到屏幕上
turtle.done()

小嘉提醒:tracer(0) 之后必须调用 update() 才会看到画面,否则窗口可能一片空白,这是新手最常踩的坑。

练习题

  1. 创建一个 500×400 的窗口,标题为"我的画板",背景色为 #eef5ff,让海龟向前走 100、左转 90° 再走 100。
  2. 用 goto 画出一个等腰三角形的三条边(自己选三个坐标点),要求起点之间用抬笔移动,不要出现多余连线。
  3. 画两条平行线:一条粗 5、颜色 "green";另一条粗 2、颜色 "orange",两条线之间留 40 像素空隙。
  4. 用 circle(50) 画一个圆,再用 dot(15, "white") 在圆心上画一个白点,圆心位置自行用 penup + goto 对准。
  5. 用 begin_fill() / end_fill() 画一个填充色为 "lightblue" 的正方形(边长 100),边框为深蓝色。
  6. 思考题: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() 可关闭动画加速出图。

扩展阅读

posted @ 2026-11-13 17:53  小嘉游戏  阅读(0)  评论(0)    收藏  举报