① 核心原则:先坐标,后代码
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 免费提供,觉得有用?打赏支持