Python Turtle 精确图形绘制指南

大多数 Turtle 教程只教"画个正方形/画个螺旋"这种玩具级示例。这份指南讲的是另一件事:怎么用坐标设计+对称公式,画出奖杯、徽章、印章这类需要"左右对称、比例精确、可复现"的图形。

目录

① 核心原则:先坐标,后代码

Turtle 画图最容易踩的坑不是"语法不会",而是"没想清楚要画什么就开始写代码",结果图形歪歪扭扭还不知道为什么。正确顺序反过来:

1. 先用手绘草图或坐标纸,确定图形上的关键转折点坐标
2. 对称图形只需要设计"一半"的坐标,另一半直接用公式取反算出来
3. 把坐标列成一个点列表,最后才写循环把点连起来

对称坐标取反公式

左半边点 (x, y)  →  右半边点 (-x, y)

只要中轴线设在 x=0,左边设计好的每个点,右边直接把 x 取负号就是镜像位置——不需要重新设计一遍。写完左半边坐标后,建议逐点检查右半边是否严格等于 -x,这是保证图形不歪的最简单办法。

填充多边形的路径规则

顶点开始 → 左侧轮廓(从上到下)→ 底部 → 右侧轮廓(从下到上)→ 回到顶点
关键提醒:用 begin_fill() / end_fill() 填充颜色时,路径必须首尾闭合(最后一步要 goto() 回到起点),否则会出现填充溢出或形状错乱。

② 基础绘制流程

import turtle as t

t.speed(0)           # 绘制速度调到最快
t.bgcolor("white")   # 背景色
t.pensize(1)         # 线宽
t.pencolor("#颜色")  # 边框颜色
t.fillcolor("#颜色") # 填充颜色

# 1. 移动到起点(抬笔移动,不留痕迹)
t.penup()
t.goto(x_start, y_start)
t.pendown()

# 2. 开始填充
t.begin_fill()

# 3. 逐点绘制路径
pts = [(x1,y1), (x2,y2)]
for x, y in pts:
    t.goto(x, y)

# 4. 闭合路径
t.goto(x_start, y_start)
t.end_fill()

# 5. 添加文字等细节
t.penup()
t.goto(x_text, y_text)
t.write("TEXT", align="center", font=("Arial", size, "bold"))

t.hideturtle()
t.done()
逐步说明penup()/pendown() 是"抬笔/落笔",抬笔时移动不会留下线条,专门用来"跳"到起点而不画出多余的线;hideturtle() 是画完后把那个箭头图标本身隐藏掉,只留下图形;t.done() 保持窗口不自动关闭,方便查看结果。

③ 放大画布(新手最容易踩的坑)

Turtle 默认画布很小(约 400×400 像素),画复杂或较大的图形时经常出现"画出了屏幕外看不到"或者"边缘被硬生生裁掉"的问题。这一步几乎每个复杂图形都需要做。

设置大画布

import turtle as t

t.setup(1000, 800)         # 窗口大小(像素)
t.screensize(2000, 2000)   # 画布大小(可比窗口大,滚动查看)

坐标缩放系数(配合小数字设计坐标,更容易验证对称)

SCALE = 3  # 缩放系数,1=正常大小,3=放大3倍

# 设计阶段用小数字(方便手算对称、方便核对)
pts_small = [(-30, 180), (-34, 176), (-38, 172)]

# 实际绘制时统一放大
for x, y in pts_small:
    t.goto(x * SCALE, y * SCALE)

# 文字也要同步放大字号
font_size = int(20 * SCALE)
t.write("TITLE", align="center", font=("Arial", font_size, "bold"))
为什么要这样做:直接用大坐标设计,人工核对"左右是否对称"会很吃力(数字大不好心算);用小坐标设计+统一放大,既好设计又好复现,出错了也容易发现是哪个点错了。

④ 印章/徽章类图形进阶画法

同心圆环(两个圆之间填充颜色)

def draw_ring(cx, cy, outer_r, inner_r, color):
    t.penup()
    t.goto(cx, cy - outer_r)
    t.pendown()
    t.pencolor(color)
    t.fillcolor(color)
    t.setheading(0)
    t.begin_fill()
    t.circle(outer_r)
    t.goto(cx, cy - inner_r)
    t.circle(inner_r)
    t.end_fill()

弧形排列文字(沿圆周写字,常见于印章/徽章边缘)

import math

def arc_text(text, cx, cy, radius, start_angle, end_angle, font_size, color):
    total = len(text)
    step = (end_angle - start_angle) / (total - 1)
    for i, ch in enumerate(text):
        angle = math.radians(start_angle + i * step)
        x = cx + radius * math.cos(angle)
        y = cy + radius * math.sin(angle)
        t.penup()
        t.goto(x, y)
        t.pendown()
        t.setheading(180 - math.degrees(angle) + 90)  # 让每个字沿切线方向朝外
        t.write(ch, align="center", font=("SimHei", font_size, "bold"))

典型印章的图层结构(从外到内)

1. 外层实心圆(最大半径,通常是主色,如红色)
2. 白色内圆(挖空效果)
3. 圆环装饰(外圈一圈同色)
4. 白色内圆(中心留白区域)
5. 弧形文字(沿边缘排列的名称/标题)
6. 中心徽标图案
7. 底部装饰(五角星/底部文字)

⑤ 常见图形坐标模板

五角星(中心在原点)

import math
# 外半径 R=30,内半径 r=11.5(这个比例画出来是标准五角星形状)
pts_star = []
for i in range(5):
    angle = math.radians(-90 + i * 72)         # 外顶点,从正上方开始
    pts_star.append((30 * math.cos(angle), 30 * math.sin(angle)))
    angle = math.radians(-90 + 36 + i * 72)    # 内顶点
    pts_star.append((11.5 * math.cos(angle), 11.5 * math.sin(angle)))

圆形 / 椭圆(用点列近似出光滑曲线)

import math
# 中心 (cx,cy),半径 rx(横)、ry(纵)
pts = []
for deg in range(0, 361, 2):  # 步长2度,约180个点,足够光滑不锯齿
    rad = math.radians(deg)
    pts.append((cx + rx * math.cos(rad), cy + ry * math.sin(rad)))
提示:步长(上面例子里的"2度")决定了曲线的光滑程度——步长越小点越多、曲线越圆滑,但生成代码/运行时间也越长;一般图形用2-5度步长就够光滑了。

⑥ 典型错误

错误原因修复
图形不对称,左右歪斜左右坐标没有严格取反逐点核对 x_右 == -x_左
填充溢出/颜色跑到图形外面路径没有闭合end_fill() 前确保 goto() 回到起点
线条呈锯齿状,不光滑坐标点之间间距太大圆形类图形步长减小到2-5度
五角星画歪了起始角度设置不对五角星起始角固定用 -90°(从正上方开始)
图形超出窗口看不全画布默认太小t.setup() + t.screensize() 放大画布
文字方向不对/歪着写没重置画笔朝向写字前用 t.setheading(0) 重置方向

⑦ 术语表

Heading(朝向)
turtle 画笔当前指向的角度,0度是正右方,逆时针递增。
Fill(填充)
用颜色填满一段闭合路径围成的区域,由 begin_fill/end_fill 一对函数控制起止。
Penup / Pendown(抬笔/落笔)
抬笔状态下移动不会画线,专门用来"跳"到某个坐标而不留痕迹。
Screensize(画布尺寸)
turtle 实际可绘制的区域大小,可以比窗口本身更大,超出窗口部分靠滚动查看。
Radian / Degree(弧度/角度)
两种角度单位,Python math 库的三角函数用弧度,turtle 的方向设置用角度,两者需要用 math.radians() 互相转换。
本文档由 shop.maysuns.uk 免费提供,觉得有用?打赏支持