资讯详情

Python入门必学:用Turtle绘制国旗和佩奇,掌握坐标、循环与函数

📅 2026/10/13 1:03:25 | 华诺云谱 👁 阅读
Python入门必学:用Turtle绘制国旗和佩奇,掌握坐标、循环与函数
很多朋友问我Python入门到底该学点什么项目。我的答案一直是那句先让屏幕上出现点东西。不管是打印表格还是用Turtle画一面国旗、一只佩奇那一瞬间的“成了”比任何语法笔记都管用。今天这篇博文就围绕Python标准库里的Turtle模块用两个实打实的案例——绘制国旗和佩奇把坐标、循环、函数、颜色填充这些入门必会的知识点串起来。你不需要有任何图形编程基础只要跟着思路把代码敲一遍再改改参数就能体验“代码控制图形”到底是怎么回事。如果你之前听说过Turtle但觉得它“太玩具”那这篇文章可能会改变你的看法。Turtle表面上只是让一只小海龟在画布上爬行但真用它做完这两个项目你会发现自己顺便掌握了坐标计算、角度换算、函数封装、图形拆解这些后续学任何图形库都用得上的底层能力。下面我从为什么选Turtle开始讲。1. 为什么Python入门首选Turtle做图形练习Turtle是Python自带的标准库从Python 3.x开始一直躺在标准库里不需要pip安装不需要联网打开编辑器就能跑。这一点在入门阶段太重要了很多新手不是被语法难倒而是先被环境配置劝退Turtle直接绕开了这个坑。更重要的一点是Turtle把代码执行的过程“可视化”了。你每敲一行forward、right屏幕上的小海龟就真的动一下。这种即时反馈对建立编程直觉的帮助是纯文字练习题给不了的。你看着它一笔一笔画出一面旗画出一只小猪那种“代码在推动真实事物”的感觉比打印一百遍hello world都强烈。1.1 Turtle的前世今生从Logo语言到Python标准库Turtle这个概念诞生于上世纪六十年代的Logo语言。设计者为了让小朋友理解编程做了一个会爬行的海龟通过告诉它“向前走”“向右转”来画图。这个想法后来被很多语言吸收Python直接在标准库里提供了一个完整的Turtle模块。你现在用的turtle.forward(100)本质上和当年小朋友敲的FORWARD 100是同一种指令。因为起步早Turtle积累了一套很成熟的图形指令体系包括抬笔落笔、填充、颜色、文本、按键事件等。虽然语法简洁但它能覆盖的知识面一点都不浅。新手能拿它练循环和函数进阶玩家能拿它画分形、做简单动画甚至有人拿它实现过迷宫的自动寻路。我经常跟初学者说别把Turtle当成幼儿园玩具。它最简单的部分是操作最难的部分是你有没有能力把脑海里想要的画面翻译成海龟听得懂的一步步指令。这个“翻译”过程恰恰是编程的核心。1.2 一只“海龟”如何帮你建立编程思维我上课时常作一个类比学编程就像给一只宠物龟下指令。你告诉它“往前走100步”“左转90度”“把笔提起来走到某个位置再放下”它全都照做。但条件是你必须把每一步说得清清楚楚不能说“大概往那边走”。这就是编程思维的起点把模糊目标拆成精确指令。画一面国旗你要拆成“画红色矩形”“画五颗黄色五角星”“让每颗星的尖角指向规定方向”画一只佩奇你要拆成“画头”“画鼻子”“画眼睛”“画身体”“画尾巴”。每一步都不复杂但合在一起就是一个完整的作品。等你开始用for循环画五角星用函数封装一个佩奇的头你会突然理解编程里“抽象”和“复用”这两个词到底是什么意思。这不是课本告诉你“函数就是封装代码块”能带来的理解而是你真的把一段画图逻辑打包带走、到处复用之后自己悟出来的。2. 画布、坐标和画笔动手前先弄清这三件事Turtle本身的指令不多但新手写出来的代码总差那么一点多半是在三件事上没想清楚坐标原点在哪、抬笔落笔有什么区别、填充颜色怎么配对。2.1 坐标系Turtle沿用数学坐标别和屏幕坐标混淆打开一个Turtle窗口默认画布中央是坐标原点(0, 0)x轴向右为正y轴向上为正。这和你高中学的平面直角坐标系完全一样所以数学里“左减右加、下减上加”的直觉可以直接用。但要注意如果你接触过Tkinter的Canvas或者其他图像处理库它们的坐标原点通常在窗口左上角、y轴向下为正。习惯那套体系的人刚转到Turtle时很容易下意识把y坐标设成负数结果图形跑到完全想不到的位置。我的建议是动手画图之前先画一个坐标草图把原点、左上角、右下角都标出来。尤其是画国旗这种多图形拼接的项目这个习惯能帮你省下大量调试时间。我在画国旗时不会让默认原点“裸奔”而是把旗面左上角固定在一个好算的坐标(-300, 200)上之后所有星星的位置都从这个左上角推算思路非常清晰。2.2 画笔状态抬笔、落笔与“不留痕迹的移动”turtle.penup()让海龟移动时不画线turtle.pendown()恢复画线。这个机制的重要性怎么强调都不过分。新手最容易犯的错是想让海龟从当前位置跳到目标位置却忘了先penup()结果画面上多了一道多余的对角线。举个例子。画国旗时画完红色旗面之后要把海龟从右下角挪到左上角去画五角星。这时候一定要先penup()再goto否则会有一条红线斜穿旗面。画佩奇的眼睛、鼻孔这些小部件时也同样每次“飞行”之前都要养成提笔的习惯。这个点看起来很小但几乎每个人都漏过一两回。还有两个容易被忽略的细节。一个是画笔粗细只影响轮廓线不影响填充区域另一个是画笔颜色和填充颜色是独立的你可以用t.color(red, red)同时设置也可以分别用t.pencolor()和t.fillcolor()单独控制。2.3 颜色与填充填充的颜色和轮廓的颜色不能混Turtle设置颜色有两个维度画笔颜色和填充颜色。例如t.color(red, red)第一个是画笔颜色轮廓线第二个是填充颜色。如果你只写t.color(red)那轮廓和填充都会变成红色。如果你又用t.pencolor(black)设置了黑色轮廓再用t.fillcolor(yellow)准备填充黄色却不注意begin_fill()和end_fill()的配对出来的效果就可能很怪。填充的标准流程是这样的先用t.fillcolor(yellow)设置填充色或者用t.color(画笔色, 填充色)一次设置两个调用t.begin_fill()画一个封闭图形调用t.end_fill()结束填充。这里最多人栽的坑是begin_fill()和end_fill()之间的路径没有被正确封闭。比如你画了一个缺口的矩形眼睛看觉得“差不多闭合了”但Turtle会按自己的算法从起点到终点连接一条直线来补救结果填充区域多出一块诡异的三角形。要避免这个问题最简单的方法是画图前先想清楚起笔点和终笔点确保最后一步能真正回到起点。3. 国旗实战一场坐标与角度的精确计算把国旗作为Turtle入门项目看起来是个图形练习实际上是一次“从需求到实现”的完整训练。因为国旗绘制有明确的公开规格长宽比、颜色、星星的位置和朝向都有标准。这些参数不需要你发明只需要你精确落实。这种“按规格画图”的体验比自由创作更能培养写代码时的严谨性。3.1 先按3:2搭画布和旗面我选用的旗面参数是长600、高400长宽比正好3:2。画布大小设为800×600保证四周有留白。把旗面左上角固定在坐标(-300, 200)这样右下角就是(300, -200)一切位置都好算。绘制旗面本身很简单就是画一个实心红色矩形import turtle import math t turtle.Turtle() t.speed(0) turtle.setup(800, 600) t.penup() t.goto(-300, 200) t.pendown() t.color(red, red) t.begin_fill() for _ in range(2): t.forward(600) t.right(90) t.forward(400) t.right(90) t.end_fill()这里用了一个两次循环实质是“先走长方形的长再转90度走宽重复两次”就把四边画完了。注意Turtle默认逆时针方向为正所以right(90)会让海龟朝右下走。这段代码跑完你会得到一块红底接下来就是画星星。3.2 画五角星之前先搞清楚边长和半径的关系很多人以为画五角星就是“forward一下、转144度、重复5次”这句话对一半。问题的关键在于你预先能确定的数据通常是五角星外接圆半径而不是边长。那forward里到底填多少这个关系靠三角函数推导。五个外顶点均匀分布在外接圆上每个顶点之间对应的圆心角是360÷572度。五角星的画法是从一个顶点连到“隔一个”的顶点所以这条边对应的是2×72144度边长的计算公式为边长 2 × R × sin(72°)约等于1.902倍的半径。你如果手头有计算器算一下就会发现这个比例在画任何正五角星时都适用。那为什么每画一条边要右转144度呢因为正五角星每个尖角的内角是36度走完一条边后海龟需要转180-36144度才能对准下一条边的方向。这串推导本身不复杂但网上大量教程直接忽略导致读者只会抄数值、不会改参数。一旦你想换个更大的五角星立刻傻眼。3.3 一个以“中心”为基准的五角星函数常见的Turtle示例里画五角星是从某个起点直接开画起点到底是五角星的中心还是顶点不同代码差别很大。我建议都写成以中心为基准的函数因为国旗规格给的是每颗星中心点的坐标。函数这样写def draw_star(cx, cy, R, direction): t.penup() t.goto(cx, cy) t.setheading(direction) t.forward(R) t.pendown() t.color(yellow, yellow) t.begin_fill() t.setheading(direction 162) side 2 * R * math.sin(math.radians(72)) for _ in range(5): t.forward(side) t.right(144) t.end_fill() t.penup() t.goto(cx, cy)参数分别是中心点的x坐标、y坐标、外接圆半径R以及“其中一个尖角的朝向方向”。先让海龟从中心走到尖角顶点然后按五角星画法闭合填充最后回到中心。这个direction参数是精髓它保证五角星不是随手一丢而是有明确朝向。为什么画第一笔前要设置成direction加162度简单解释一下站在外接圆的尖角顶点上要连到“隔一个”的顶点这条弦的方向和径向夹角是18度但海龟方向需要再转一个平角的补角实际偏移是162度。你先把这个数当成一个固定偏移量跑通之后再回头验证也来得及。3.4 用atan2计算“指向目标”的角度国旗上的星星有个讲究大五角星的一个尖角指向旗面左上角四颗小五角星各有一个尖角指向大五角星中心形状。要实现这个效果必须计算出从每颗星中心指向目标点的方向角。用数学库里的atan2最稳妥def angle_to(tx, ty, fx, fy): return math.degrees(math.atan2(ty - fy, tx - fx))tx、ty是目标点fx、fy是起点。按公开的国旗规格以旗面左上角为基准大五角星中心在“从左往右1/6、从上往下1/5”处四颗小五角星的中心分别在“2/6、1/10”、“3/6、1/5”、“4/6、1/5”、“5/6、1/10”处。套用到旗面左上角(-300, 200)、长600高400的坐标系里就得到这张表星星中心坐标外接圆半径大五角星(-200, 120)60小五角星1(-100, 160)20小五角星2(0, 120)20小五角星3(100, 120)20小五角星4(200, 160)20大五角星需要朝向左上角(-300, 200)所以direction是angle_to(-300, 200, -200, 120)算出来约141.2度。四颗小五角星都要朝向大五角星中心(-200, 120)分别计算d1 angle_to(-200, 120, -100, 160) d2 angle_to(-200, 120, 0, 120) d3 angle_to(-200, 120, 100, 120) d4 angle_to(-200, 120, 200, 160)得到的方向角分别是约201.8度、180度、180度、185.7度。有了坐标、半径和方向五次调用draw_star就能得到标准样式。3.5 完整代码与运行效果把前面积累的素材拼起来完整代码大约五十行。运行后你会看到红底黄五角星的旗面图案五颗星的相对位置和朝向符合公开规格。我在调用处直接传入计算好的方向draw_star(-200, 120, 60, angle_to(-300, 200, -200, 120)) draw_star(-100, 160, 20, angle_to(-200, 120, -100, 160)) draw_star(0, 120, 20, angle_to(-200, 120, 0, 120)) draw_star(100, 120, 20, angle_to(-200, 120, 100, 120)) draw_star(200, 160, 20, angle_to(-200, 120, 200, 160)) t.hideturtle() turtle.done()一个小提醒如果你运行后窗口没反应先确认最后一行是turtle.done()。这个方法会进入事件循环并保持窗口打开。用input()之类的方式替代窗口会在瞬间关闭什么都看不到。4. 佩奇实战把卡通角色拆成可执行指令画完国旗再画佩奇你能立刻感受到两种项目风格的差异。国旗是完全的解析几何一切有规格可依佩奇则不同没有人规定佩奇必须精确到多少像素。它考验的是另一种能力把模糊的视觉形象拆解成具体的图形单元。前者是“按图施工”后者是“设计师思维”两个都值得练。4.1 拆解佩奇像拼乐高一样拼角色我第一次想用Turtle画佩奇时盯着角色看了好几分钟脑子里只有“她是一头粉色小猪”这一句。后来我把图放大拿笔在纸上拆才意识到佩奇其实由这些零件组成身体部位用什么图形近似颜色头大椭圆粉色鼻子小椭圆加两个实心小圆深一点粉色加黑色眼睛两个实心小圆黑色腮红和嘴小椭圆和弧线粉色、深粉耳朵两个小半圆或小椭圆粉色身体红色大椭圆红色四肢粗线条红色鞋子深色小椭圆深蓝尾巴旋转卷曲的线红色关键一步是不要一上来就想写完整代码先在纸上画出每个零件的坐标范围比如“头在(0, 80)附近身体在(0, -60)附近”。这一步和画国旗时定坐标的方法完全一样专业图形程序员也都是这样工作的。4.2 Turtle画椭圆没有椭圆函数也能画Turtle只提供了circle(radius, extent)方法画圆弧没有专门画椭圆的接口。但我们可以用“两段圆弧拼一个椭圆”的技巧def ellipse(a, b): t.pendown() for _ in range(2): t.circle(a, 90) t.circle(b, 90)原理很简单先用半径a画一个90度弧再用半径b画一个90度弧交替两次首尾相连正好形成封闭的“类椭圆”图形。a大于b时画出来是扁椭圆a小于b时是竖椭圆。这个方法很实用。佩奇的头可以用接近正圆的椭圆来画身体则用竖椭圆。它虽然不是数学意义上的严格椭圆但视觉上完全够用对入门阶段来说没必要用逐点逼近的方式把椭圆算得那么精确。4.3 先画头部佩奇的“像”全在五官比例佩奇最核心的特征是头特别大鼻子是凸出来的嘴巴是侧面的“3”字形状。先写头部代码PINK #F4A0B8 DEEP_PINK #E07A9E BLACK #000000 t.speed(0) t.penup() t.goto(0, 80) t.setheading(0) t.fillcolor(PINK) t.begin_fill() ellipse(90, 80) t.end_fill()这里用setheading(0)把海龟的初始朝向固定为朝右再调用ellipse头就会是一个相对端正的椭圆。如果你不设置朝向海龟保留之前的朝向同一个ellipse可能画出歪的图形。然后是鼻子和鼻孔。佩奇的鼻子是凸出脸部轮廓的所以要把小椭圆放在头部的右下侧稍微超出大椭圆的边缘t.penup() t.goto(30, 70) t.setheading(0) t.fillcolor(DEEP_PINK) t.begin_fill() ellipse(30, 22) t.end_fill()鼻孔可以用两个黑色实心小圆代替画两个半径为4的小圆位置在鼻子的中下方。眼睛和腮红决定“像不像”眼睛建议放在头部上方偏后位置两个小黑点间距别太大腮红用两个浅粉小圆放在鼻侧下方。这一步我强烈建议多试几组坐标因为佩奇的眼睛和腮红只要偏几个像素气质就会完全改变。4.4 身体、四肢、卷尾巴拼装完整角色头画完之后身体和四肢就简单多了。身体是一个纵向的红色椭圆可以稍微向下压一点甚至可以盖住头的底部这样头身过渡更自然t.penup() t.goto(0, -60) t.setheading(90) t.fillcolor(#D62828) t.begin_fill() ellipse(60, 70) t.end_fill()因为setheading(90)让海龟朝上这个ellipse的长短轴交换画出来的就是一个竖长的椭圆。四肢用粗画笔直接画线段就行先penup移动到肩膀位置pendown后forward到脚底再用深蓝色小椭圆画鞋子。尾巴是佩奇的重要辨识点。可以画一段半径不断减小的圆弧看起来就像往里卷的尾巴t.penup() t.goto(-60, -40) t.setheading(180) t.pendown() t.pencolor(#D62828) t.pensize(4) for r in range(20, 8, -2): t.circle(r, 60)这段代码让海龟在半径从20递减到10的圆弧上画线每段60度最后形成往内卷的螺旋状尾巴。上面这些代码片段是分散讲解的实际组合时在文件开头统一设置颜色常量和画笔初始状态就能拼成完整可运行的佩奇程序。4.5 为什么你的佩奇“不像”比例比代码更重要我见过很多初学者把代码抄对了成品却怎么看都不太对劲原因十有八九是比例出了问题。佩奇的大头几乎占全身的三分之一以上鼻子必须明显凸出脸部轮廓耳朵要立在头顶而不是贴在头侧。判断一个角色像不像不是看每一笔画得有多精细而是看几个关键部件之间的空间关系对不对。一个很有效的自检方法画完后把整个窗口缩小到手机图标大小再看一眼。这时细节被模糊掉只剩色块轮廓如果还能一眼认出是佩奇你的比例就到位了。这个方法在画国旗以外的任何图形时都适用。5. 新手最容易踩的六个坑与一套调试方法就算你照着代码敲也可能会遇到下面这些情况。我把最常见的六类问题整理出来每条都给出排查思路而不只是给答案。毕竟调试能力才是入门阶段最该培养的东西。5.1 窗口一闪而过什么都来不及看最常见的原因就是脚本末尾缺少turtle.done()或turtle.exitonclick()。done()会让Turtle进入事件循环窗口保持打开直到你手动关闭。注意别把它漏在某个条件分支里也别写在return之前。如果你用的是Jupyter NotebookTurtle的体验其实一般我建议入门阶段直接用脚本方式运行最稳。5.2 图形和目标位置对不上这多半是坐标计算问题。Turtle的y轴向上为正和很多图形库相反所以一旦有“图形整体偏向下方”的现象优先检查所有y坐标的正负号。排查时可以在goto前后分别打印当前坐标很快就能定位到哪一步偏了。5.3 填充结果多了或少了奇怪的一块根本原因是填充路径没有封闭。常见错误包括在begin_fill()和end_fill()之间写了penup()导致填充路径被打断或者最后一个边没有真正回到起点。建议每次begin_fill()之前先用goto把起点确定画完闭合路径后再end_fill()。如果你发现填充区域里连出了一条没人画过的直线那就是Turtle在自动“补路”。5.4 五角星画出来是歪的或尖角指向不对能画出五角星但朝向不对问题一定出在setheading的初始角度或者draw_star函数里direction和第一笔之间那162度的偏移。先把我给的完整代码原样跑一遍做基准验证如果你的星星方向仍然偏再检查传入的坐标是不是绝对坐标而不是相对位移。5.5 画得太慢等得无聊默认速度下一个几百笔的佩奇会画得比较久。t.speed(0)是最快捷模式0不代表静止而是“尽可能快”。如果还是觉得慢可以加turtle.tracer(False)关闭逐帧刷新全部画完后用turtle.update()一次性刷新。但我不建议新手一开始就关刷新因为你需要通过一步步的动画来理解每个方法实际做了什么。5.6 报错看不懂先做最小复现Turtle的报错信息对新手不算友好经常一个NameError就把人难住。我的应对方法是一条铁律把代码不断删除直到留下一个能复现问题的最小片段。比如怀疑circle参数有问题就只写一行t.circle(-50)看它报不报错、图画成什么样。这个小技巧能过滤掉90%的非关键干扰让问题暴露在最小上下文里。6. 从国旗和佩奇延伸出去下一步怎么走这两个案例做完以后千万不要急着找下一个“跟着敲”的教程。你已经拥有的东西比代码本身值钱得多你会算五角星的边长和外接圆半径你会用atan2求方向角你会把卡通角色拆成椭圆和弧线你会用函数封装一个可复用的绘图单元。这几项能力已经足够解决大量图形编程问题。6.1 同一套方法迁移到其他项目国旗里的坐标计算能力可以直接迁移到任何规则几何图形上正多边形、星形、齿轮、雪花分形。佩奇里的图形拆解能力可以迁移到任意卡通角色或图标上比如米奇头像、皮卡丘、小房子。我在带新人的时候常给一个练习把画国旗的draw_star函数改成draw_polygon接收一个边数参数。你会立刻发现for循环和角度计算为什么是通用的。6.2 函数封装带来的改变画一面旗可能体会不到函数的重要性但你可以试着画十面大小不同、位置不同的旗子。如果每面旗都复制一遍代码改起参数来会让人崩溃。把五角星封装成函数之后需要几面旗就调用几次每次只改坐标和半径。这就是封装的意义也是后续学面向对象思想的基础。6.3 下一步学习路线建议如果想往Python开发方向走Turtle只是最轻松的入门台阶。我推荐沿着这样的顺序前进先把Turtle折腾透试着用递归画几棵分形树然后进入matplotlib学习规范的绘图API再根据兴趣选方向做游戏可以碰pygame做图像处理可以学Pillow。如果目标只是给家里小朋友做点小动画那Turtle也完全够用。你可以给佩奇加上键盘控制让她能前后左右移动顺便把事件绑定学会。最后分享一个土办法无论画国旗还是画佩奇我动手之前一定先在格子纸上画草图把关键坐标和方向角标清楚再写代码。这个习惯看上去很笨却是我从多次“画完发现整体偏移”的教训里总结出来的。先把坐标系想明白再让代码替你去画你会发现Turtle远比想象中可靠。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑