ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Python入门必学:用turtle库从零绘制一只皮卡丘全攻略

2026/10/5 5:57:36 拓冰建站 浏览量
Python入门必学:用turtle库从零绘制一只皮卡丘全攻略 去年有朋友问我Python这样一门“正经语言”初学者能玩出点什么有意思的东西。我给的回答很直接拿turtle库画个皮卡丘试试。你别小看这个项目它看起来只是把一只黄色电气老鼠搬上屏幕实际上把Python里最常用的坐标、循环、函数、填充和弧线绘制全串起来了。不管你是刚装好Python、连变量都还没理顺还是已经能写点小脚本但想练图形编程这个项目都值得花一个下午敲一遍。做完之后你会发现自己对“代码是怎么把数据变成画面”这件事有了特别直观的体感。这个项目不依赖任何第三方库不需要装numpy、opencv或者matplotlib只需要Python自带的turtle模块就能跑。它是标准库的一部分只要Python环境正常import turtle就能用。这也是我推荐它作为入门图形项目的原因零依赖纯标准库出错点少反馈却非常及时。下面我把整个思路和能直接跑通的代码都摊开讲。1. 项目整体设计与思路拆解1.1 从训练逻辑的角度看为什么要选皮卡丘turtle库的基本命令很简单forward、backward、left、right、penup、pendown。多数教程会让你画个正方形、五角星或者螺旋线练是练了但缺少一个能让人“截图保存”的目标。皮卡丘不一样它至少有四种值得练手的图形元素圆形脸、眼睛、脸颊都是圆涉及圆心坐标、半径和填充。三角形/多边形耳朵是明显的尖角形状涉及多点定位和闭合路径。弧线嘴巴需要曲线涉及turtle.circle的半径和弧度参数。图层顺序耳朵在头后面眼睛在脸上高光在眼睛上。不按顺序画画面就会乱。所以画皮卡丘并不是在“画图”是在练习控制画笔的坐标体系、填充逻辑和执行顺序。这四点正好是之后用matplotlib画数据图、用pygame做小游戏、哪怕是用turtle做简单动画都绕不开的基本功。1.2 turtle库核心原理一支有状态的画笔理解turtle之前你先建立一个画面模型一张无限大的画布上有一只带着画笔的小海龟。它有三个关键状态位置、朝向、画笔属性。位置用坐标(x, y)表示朝向用一个角度表示画笔属性包括颜色、粗细、是否抬起、是否填充等。初学的时候最容易忽略的是“朝向”。比如你想从左往右画一条线得知道当前海龟头朝哪儿。turtle默认朝向是0度也就是朝右。left(90)是逆时针转90度right(90)是顺时针转90度。很多初学者画到一半图形歪了就是因为没有管理好朝向。turtle.circle(radius, extent)这个命令很多人容易误解。它并不是画一个完整圆的时候才用当你只传一个半径时画完整圆当你传第二个参数extent时会画一段圆弧。比如circle(50, 90)就是画半径50的四分之一圆弧起点是当前海龟的位置和朝向。这个机制画皮卡丘的嘴巴和耳朵轮廓非常顺手。填充的逻辑也很简单先用fillcolor设置颜色然后调用begin_fill()之后所有落笔绘制的闭合路径都会被填充直到end_fill()结束。但有一个坑如果你画的路径没有回到起点填充区域会按起点到终点的虚拟直线补全有时会填出奇怪的形状。所以画多边形时最后一点一定要闭合回起点。1.3 方案选型为什么用坐标定位而不是一直forward/left画皮卡丘有两种主流思路一种是全程用forward和left像真人画画一样不断调整方向另一种是先用penup和goto跳到指定坐标再落笔画。我强烈推荐第二种。原因很简单皮卡丘是左右对称的图形坐标定位可以精确控制两边的一致性。比如眼睛的位置是(-40, 30)和(40, 30)手写对称时肉眼就能检查。如果只用forward和left你根本没法保证左边耳朵和右边耳朵长得一样。坐标定位还有一个好处方便你拆函数、做微调。想改眼睛大小直接改参数不需要牵扯别的代码。这套思路不仅适用于turtle也很贴近真实图形编程里的“顶点定位”思维。2. 环境准备先把Python和turtle折腾明白2.1 Python安装与版本选择这个项目对Python版本要求不苛刻3.8到3.12都可以。我建议去python.org下载官方安装包安装时Windows平台一定要勾选“Add Python to PATH”选项否则后面在命令行里敲python会提示找不到命令。Linux系统一般自带Python但有些精简版系统没装完整版可以先敲python3 --version确认如果没有就通过系统包管理器安装。macOS用户用官方pkg包或者Homebrew都行。装好之后打开终端输入python进入交互式环境再输入exit()退出。这一步能确认Python能正常启动。接下来在Python交互环境里输入import turtle能正常导入就说明turtle模块没问题。2.2 为什么turtle库用不了三种典型情况网上搜“为什么turtle库用不了”会看到一堆人明明装好了Python运行import turtle却报错。总结下来主要有三种情况第一种把自己写的py文件命名为turtle.py。这个文件会和标准库里的turtle模块冲突Python在import turtle时优先导入了你的文件导致各种奇怪报错。解决办法很简单项目文件名别叫turtle.py改成pikachu.py这类名字。第二种Linux系统缺少tkinter。turtle库依赖tkinter做窗口显示而有些Linux发行版不会自动安装tkinter。此时即使import turtle成功创建窗口时也可能报错。Debian/Ubuntu系列可以用sudo apt install python3-tk解决装完再运行就正常。第三种在无图形界面的服务器或者远程终端里运行。服务器上跑turtle它想打开一个GUI窗口但系统根本没有显示环境就会抛turtle.Terminator或者其他窗口错误。如果只是学习直接在自己电脑的桌面环境运行别放到服务器上折腾。2.3 编辑器选哪个VSCode还是PyCharm两个都可以但注意一点要用“运行”按钮或者终端直接运行py文件不要在交互式终端里一行一行敲。VSCode需要安装官方Python扩展然后打开项目文件夹在终端中使用python pikachu.py运行。PyCharm更简单新建项目时会自动配置解释器直接右键运行脚本。如果之前在PyCharm里折腾过虚拟环境记得确认当前解释器是你安装Python的路径别误选成conda或者其他环境否则会出现明明装好了Python却找不到turtle的假象。还有一个小建议窗口最后要保留。在脚本结尾加上turtle.done()或者turtle.exitonclick()否则程序运行完窗口会立刻关闭很多人以为画图失败其实只是没加最后这句。3. 画图思路把皮卡丘拆成可落地的几何块3.1 从视觉观察出发先分解再动手拿到一张皮卡丘图别急着写代码。先把它拆成几个基本形状头一个大的黄色圆。耳朵左右各一个黄色三角形耳朵尖有一小块深色区域。脸颊两个红色圆分布在脸下部两侧。眼睛左右各一个黑色圆左上角加一个白色小圆作为高光。鼻子一个小黑色圆位于脸部中线上。嘴巴两条对称或近似对称的弧线。拆完你会发现这个项目用到的图形能力其实就是圆和三角形的组合。这也就是为什么turtle文档虽然简单却能画出非常丰富的内容——再复杂的图形都是由基础几何元素叠加出来的。3.2 坐标系规划与绘制顺序设计我采用的坐标系中心(0,0)作为头部圆心这样可以方便地为所有特征点做对称定位。比如眼睛左侧是(-40, 40)右侧就是(40, 40)脸颊左侧是(-70, -20)右侧就是(70, -20)。这样做的好处是哪怕你调了半径左右也不会失衡。绘制顺序特别关键。我的顺序是先画耳朵再画头部然后画脸颊、眼睛、鼻子最后画嘴。耳朵先画会被头部的圆盖掉一部分这样看起来就是自然“长”在头后面如果后画耳朵就会有两条生硬的板块突出在头上效果差很多。图层顺序是图形编程里一个非常核心的思维皮卡丘正好用最直观的方式帮你建立这个概念。接下来我把每一步拆开讲并且附上完整代码。4. 核心代码实现从轮廓到上色的完整过程4.1 初始化窗口与画笔先导入turtle然后创建画笔对象。我这里把速度调成8方便看到动态绘制过程如果你追求更快可以直接speed(0)。画笔粗细设为4颜色用一个接近黑色的深灰这样视觉上比纯黑更柔和。import turtle t turtle.Turtle() t.speed(8) t.pensize(4) t.pencolor(#333333) YELLOW #F7D74A RED #E03A3A BLACK #2B2B2B WHITE #FFFFFF DARK #3A3A3A这里定义的颜色常量对初学者很友好后面想换色调时只改一行就够了。4.2 封装两个基础绘制函数我封装了两个函数一个是画圆一个是画多边形。画圆函数需要传入圆心坐标、半径和颜色函数内部会先抬笔移到圆的底部再落笔填充。画多边形函数接收点列表和颜色按顺序连接所有点最后闭合。def jump(x, y): t.penup() t.goto(x, y) t.pendown() def fill_circle(x, y, r, color): jump(x, y - r) t.fillcolor(color) t.begin_fill() t.circle(r) t.end_fill() def fill_poly(points, color): t.penup() t.goto(points[0]) t.pendown() t.fillcolor(color) t.begin_fill() for p in points[1:]: t.goto(p) t.goto(points[0]) t.end_fill()你说为什么要提前到圆心下方再画circle因为turtle的circle默认是从当前点开始以当前朝向为切向画圆。如果当前点在圆心画出来的圆会偏移。先移到圆心正下方再调用circle画出来的圆就会严格以(x, y)为圆心。这个细节很多人不注意结果画出的图形总是偏到一边去。4.3 轮廓绘制耳朵在前面头部压住基石先画左右耳朵。左耳用三个点定位靠近头顶的内侧点、左上角耳尖、靠近脸颊的外侧点。右耳就是x坐标取反形成镜像。注意三角形顶点要尽量高这样耳尖才会明显突出。# 左耳 fill_poly([(-15, 90), (-105, 240), (-70, 85)], YELLOW) # 右耳 fill_poly([(15, 90), (105, 240), (70, 85)], YELLOW) # 左耳尖 fill_poly([(-105, 240), (-90, 180), (-115, 165)], DARK) # 右耳尖 fill_poly([(105, 240), (90, 180), (115, 165)], DARK)画完耳朵立刻画头部。头部是一个圆心在(0,0)、半径110的黄色大圆。因为圆半径很大所以会自然盖住耳朵三角形的底部只留下尖尖的耳朵露在头部轮廓外。这个“先底层后顶层”的顺序比你去精确计算两条线怎么相交要省心得多。fill_circle(0, 0, 110, YELLOW)4.4 五官细节用圆和弧线画出表情眼睛位于头部上半部分两侧先用黑色画大圆再用白色小圆在左上角点高光。高光的偏移很讲究左侧眼睛高光在(-46, 52)右侧眼睛高光在(34, 52)都偏向各自眼睛的左上角这样成像出来是统一的斜上方光源比两边都在正中心要自然。# 左眼 fill_circle(-40, 45, 14, BLACK) fill_circle(-46, 52, 5, WHITE) # 右眼 fill_circle(40, 45, 14, BLACK) fill_circle(34, 52, 5, WHITE)脸颊是两个红色圆位置在横向坐标±65纵向坐标-20附近。这个位置要避开眼睛又足够靠近边缘才会有皮卡丘那种鼓鼓的可爱感。半径选18如果觉得硅谷不够明显可以改成20但别太大不然会碰到下巴。fill_circle(-65, -20, 18, RED) fill_circle(65, -20, 18, RED)鼻子用一个黑色小圆在(0, 5)的位置。嘴巴用两条弧线从鼻子下方开始向两侧上翘。我用setheading控制弧线的起始朝向然后用circle画一小段弧形段。fill_circle(0, 5, 6, BLACK) # 嘴巴 jump(-8, -10) t.setheading(-60) t.pencolor(BLACK) t.pensize(5) t.circle(20, 60) t.setheading(240) t.circle(20, -60)这里为什么先setheading再circle因为circle的起笔方向由当前朝向决定。如果不调整朝向弧线方向会不对。你可以试试不写setheading直接circle画出来大概率是一个不匹配的弧线。整段代码运行后只在屏幕上留下一个圆形皮卡丘头像素已经很有辨识度了。完整代码我按顺序贴在下面方便直接复制运行。import turtle t turtle.Turtle() t.speed(8) t.pensize(4) t.pencolor(#333333) YELLOW #F7D74A RED #E03A3A BLACK #2B2B2B WHITE #FFFFFF DARK #3A3A3A def jump(x, y): t.penup() t.goto(x, y) t.pendown() def fill_circle(x, y, r, color): jump(x, y - r) t.fillcolor(color) t.begin_fill() t.circle(r) t.end_fill() def fill_poly(points, color): t.penup() t.goto(points[0]) t.pendown() t.fillcolor(color) t.begin_fill() for p in points[1:]: t.goto(p) t.goto(points[0]) t.end_fill() # 左耳 fill_poly([(-15, 90), (-105, 240), (-70, 85)], YELLOW) # 右耳 fill_poly([(15, 90), (105, 240), (70, 85)], YELLOW) # 左耳尖 fill_poly([(-105, 240), (-90, 180), (-115, 165)], DARK) # 右耳尖 fill_poly([(105, 240), (90, 180), (115, 165)], DARK) # 头 fill_circle(0, 0, 110, YELLOW) # 左眼 fill_circle(-40, 45, 14, BLACK) fill_circle(-46, 52, 5, WHITE) # 右眼 fill_circle(40, 45, 14, BLACK) fill_circle(34, 52, 5, WHITE) # 脸颊 fill_circle(-65, -20, 18, RED) fill_circle(65, -20, 18, RED) # 鼻子 fill_circle(0, 5, 6, BLACK) # 嘴 jump(-8, -10) t.setheading(-60) t.pencolor(BLACK) t.pensize(5) t.circle(20, 60) t.setheading(240) t.circle(20, -60) t.hideturtle() turtle.done()4.5 给头部加上身体和尾巴的扩展思路如果你不满足于只画一个头想画完整的皮卡丘思路其实是一样的。身体仍然是一个大的黄色椭圆或椭圆组合你可以用两个不同半径的圆重叠来模拟椭圆或者用fill_poly画一个粗略的多边形身体。尾巴可以直接画成一条闪电形状的折线。额头注意一点无论你画多少额外部分都要把“图层顺序”放在心里。完整皮卡丘的顺序应该是耳朵和尾巴最高层头部、身体、手臂依次向上覆盖最后画脸和腮红。这样生成的图像才有层次感。5. 常见问题与排查实录5.1 窗口闪退怎么办这是我见过最多的问题。在VSCode或PyCharm里点运行画图窗口一闪就没了甚至连图形都没看到。绝大多数原因是脚本没有在最后保留窗口。turtle画完后程序会继续往下执行而Python执行完最后一行通常会退出进程窗口自然就消失了。解决办法是在脚本末尾加上turtle.done()或者turtle.exitonclick()。前者会保持窗口直到你手动关闭后者会在你点击窗口时关闭。还有一个可能如果你的代码在画图过程中抛了异常窗口当然也会闪退。这时你需要看控制台输出的报错信息不要只看“窗口闪退”要找到Traceback那一行具体原因。5.2 turtle窗口无响应或卡死如果窗口一直开着但海龟半天不动或者点了没反应大概率是程序进入了死循环。最常见的原因是在循环里用了while True而且没有退出条件海龟一直在原地转圈窗口当然卡住。排查办法是把速度调慢一点比如speed(2)同时观察命令行是否还在持续输出。如果确认是死循环直接关掉窗口强制停止去检查循环条件。另外如果在脚本编写过程中用了input()幺蛾子程序会阻塞在等待键盘输入窗口看起来也像是卡死。这种情况不要困惑切回控制台看是不是在等你输入。5.3 画出的图形位置不对或超出窗口范围很多人画完发现图形跑到屏幕边缘只露出一半。这多半是坐标系计算问题。turtle默认窗口大小是800x600左右中心点是(0,0)横纵向范围大致是-400到400、-300到300。如果你设计的点的y坐标到了240再算上圆形半径110上限已经超过300了耳朵尖就可能被截掉。解决方式有两种一种是把整体坐标缩放比如所有坐标除以1.2另一种是在初始化时调整窗口大小用turtle.setup(width900, height800)把画布调大一点。相比之下我推荐先在后画布尺寸再根据结果微调坐标比一个个坐标手调要快。还有人搜索“python画图横坐标太密集”这通常是在说matplotlib里的刻度拥挤问题和turtle完全是两码事。如果你在turtle里遇到类似“图形挤成一团”的情况多半是元素半径比例失调解决办法是适当缩小五官的半径给整体留出呼吸空间。我把常见问题整理成一个速查表方便你出问题时一眼定位。现象可能原因解决方式窗口闪退脚本末尾没有turtle.done()或exitonclick()在文件末尾加turtle.done()import turtle报错命名冲突文件被命名为turtle.py重命名项目文件Linux下无法创建窗口缺少tkinter安装python3-tkVSCode里运行报找不到turtle解释器选错或虚拟环境异常检查Python解释器路径窗口卡死无响应程序陷入死循环或等待input检查循环和输入强制关闭窗口后修改图形超出窗口边缘坐标超出默认画布范围使用turtle.setup调大窗口或缩放坐标填充颜色不对用了pencolor而不是fillcolor确认fillcolor和begin_fill/end_fill配对海龟转身方向不对没有管理setheading朝向明确设置起笔方向避免依赖默认朝向5.4 几个操作层面的小窍门头两侧可以加turtle.speed(0)直接画完但初学我还是建议保留speed(8)看着绘制过程能更直观理解每段代码对应哪个部分。把填充函数拆出来也是我想强调的。不要在main程序里到处begin_fill和end_fill那样一旦逻辑乱了很难排查。封装成fill_circle和fill_poly之后每个图形的填充逻辑都在函数内部完成出现问题可以直接定位到对应函数。6. 经验总结与后续扩展6.1 从皮卡丘到更多角色通用方法论画完这只皮卡丘你的方法论其实已经成型了观察图像、拆基础形状、定坐标系、排图层顺序、用函数封装重复操作。这个方法不只是画皮卡丘画任何像素图、logo、卡通头像都能用。比如你想画一个精灵球其实就是先画上半红、下半白两个半圆中间加一个黑色横条再加一个中心白色圆。难度比皮卡丘低很多但步骤完全一样。我想鼓励你尝试一个进阶动作按下print(t.pos())或者print(t.heading())来查看当前的位置和朝向。这在调试时特别有用能让你对照实际坐标和预想坐标的偏差。很多图形偏差其实不是一个点设错了是朝向没管好学会查看这一步能大幅提升调试效率。6.2 个人操作体会别追求一次完美参数调优才是最大收获我在带新手做这个项目时观察到大家最大的障碍不是不懂turtle命令而是“总觉得一次就能画对”。实际上完全不调整参数就能画出满意皮卡丘的情况几乎不存在。眼睛高了、腮红小了、耳朵尖了都是正常的事。你应该做的是快速定位到相关函数的参数改完再跑一遍。这个过程极其锻炼“程序调试”的基本功发现问题、定位原因、修改参数、验证结果。最后还有一个私心建议画完后可以试着把颜色常量和部分坐标值抽到一个配置区然后把这版代码保存好。以后想换颜色画一个粉皮卡丘、想调成大头版皮卡丘只需要改配置不用动逻辑。这样做过一次你才会理解只要代码结构拆得够好改需求并不可怕。这就是turtle绘图除了“画出一只皮卡丘”之外额外送给你的编程思维。