ARTICLE DETAIL

建站实战干货

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

Python Turtle画皮卡丘:零基础图形编程实战教程

2026/9/3 20:01:23 拓冰建站 浏览量
Python Turtle画皮卡丘:零基础图形编程实战教程 经常有初学者问我Python 基础语法学完之后能做什么有意思的东西我的建议往往不是写爬虫、不是上 Web 框架而是先用 Python 自带的turtle库画一个自己喜欢的角色。画图这件事看起来简单但它能一次性把循环、函数、坐标、填充、角度这些基础概念串起来是性价比极高的入门实战项目。这篇文章就用“皮卡丘”这个经典造型完整拆解一个基于 Python Turtle 的图形绘制项目。你会看到如何把角色造型拆解成头、耳朵、眼睛、身体、尾巴等独立部件再通过坐标规划与几何图形组合最终画出一个卡通简化版皮卡丘。代码会分步骤给出最后整合成可运行脚本。新手可以直接照抄运行有一点基础的同学也能从中复习坐标与函数的封装技巧。先说明一点皮卡丘是宝可梦系列的经典角色本文只作为 Python 图形编程学习演示造型做了很多简化版权归原版权方所有。代码核心目标不是 100% 复刻原版形象而是用最基础的几何图形完成一个“一眼能认出”的卡通角色。1. 项目背景与实现思路1.1 为什么用 turtle 画皮卡丘Python 的turtle海龟绘图是标准库中的一个绘图模块。它的核心模型是屏幕上一只“海龟”拿着画笔通过前进、后退、左转、右转、抬笔、落笔等指令留下移动轨迹。这个模型并不复杂却能完成很多看似高级的图形效果。常见的学习路径中turtle通常被用来画直线、多边形、螺旋线、分形树等几何图形。但在实际学习体验里单纯画几何图形容易枯燥很多同学坚持不到项目阶段。换成“画一个喜欢的角色”之后效果完全不一样你会在不自觉中调整坐标、角度、填充范围最终看到角色慢慢成型这种反馈是非常直接的。这个项目的技术关键词是turtle、坐标系、角度、循环、填充、函数封装。你不需要额外安装第三方库会运行 Python 脚本即可。1.2 皮卡丘造型拆解一个卡通角色的画法和写代码的思路其实很像先拆解再组装。皮卡丘的造型可以拆成下面几个部分部件几何表示颜色头大圆黄色耳朵两个倾斜长椭圆黄色耳尖黑色眼睛黑色圆 白色高光圆黑/白脸颊两个红色圆红色嘴巴W 形折线黑色身体一个横向椭圆黄色手臂两个纵向小椭圆黄色腿两个横向小椭圆黄色尾巴锯齿形多边形黄色这样拆完之后编程思路就很清晰了先画后面的部件再画前面的部件先画大轮廓再画五官细节。绘制顺序大概是从下到上、从后到前尾巴 → 腿 → 身体 → 手臂 → 头 → 耳朵 → 眼睛 → 脸颊 → 嘴巴。1.3 技术方案选择市面上也有很多用 OpenCV、PIL 或前端 Canvas 画皮卡丘的方案但对于 Python 初学者来说turtle是最合适的不需要安装第三方库零依赖。能够直观地看到画笔运动过程。代码易懂适合逐行拆解。绘制结果可以保存为 EPS 矢量图方便后续转换。因此本文选择turtle作为核心绘制工具绘制过程中只使用基本图形圆、椭圆、折线、多边形。2. 环境准备与运行说明2.1 Python 版本要求turtle是 Python 标准库中的模块只要你的电脑能运行 Python基本就自带turtle。本文示例在 Python 3.x 环境下编写理论上有 Python 3.6 及以上版本都可以直接运行。如果你的环境已经安装了较新的 Python 3.8、3.10、3.12 或更高版本不需要额外配置。可以在命令行中输入下面的命令检查 Python 版本python --version如果提示找不到python可以尝试python3python3 --version2.2 开发环境选择绘制turtle图形需要一个能弹出窗口的环境。推荐使用下面几种方式本机安装 Python 官方环境直接运行.py脚本。本机使用 PyCharm 或 VS Code通过终端运行脚本。Jupyter Notebook 中也可以运行但部分环境需要额外%matplotlib inline之类的配置本文不展开。需要注意某些在线网页版 Python 环境无法正常弹出turtle窗口所以建议优先在本机运行。2.3 项目文件结构这个项目只有一个脚本文件结构如下pikachu-turtle/ └── pikachu.py我们最终要把所有代码写入pikachu.py然后在命令行中执行python pikachu.py3. turtle 核心绘制基础在正式开始画皮卡丘之前先把会用到的基础 API 快速过一遍。已经熟悉turtle的同学可以跳过这一节直接看第 4 节不太熟悉的同学建议认真看一下后面代码会反复用到这些方法。3.1 画布与坐标系turtle默认打开一个画布窗口坐标系以窗口中心为原点(0, 0)水平方向为 x 轴垂直方向为 y 轴。默认窗口宽度约 800 像素高度约 600 像素所以 x 轴范围大约是-400 ~ 400y 轴范围大约是-300 ~ 300。在绘制皮卡丘之前先确定角色的大致范围。本文设计的皮卡丘高度大约从y280到y-210宽度大约从x-220到x220可以保证全部落在默认窗口内。常用设置画布的代码import turtle turtle.setup(800, 600) turtle.bgcolor(#87CEEB) turtle.speed(5)speed(5)是画笔运动速度可选范围是0 ~ 10。0表示最快并且没有动画效果10表示较快的动画效果1最慢。3.2 画笔控制方法下面这些方法会经常用到方法作用turtle.penup()抬笔移动时不画线turtle.pendown()落笔移动时画线turtle.goto(x, y)移动到指定坐标turtle.forward(distance)沿当前方向前进指定距离turtle.setheading(angle)设置画笔朝向0 表示向右90 表示向上180 表示向左270 表示向下turtle.circle(radius, extent)画圆或圆弧extent表示角度最常见的抬笔、移动、落笔组合是turtle.penup() turtle.goto(100, 100) turtle.pendown()这样可以让海龟在不画线的情况下快速移动到目标位置。3.3 填充颜色填充图形的固定流程是先设置填充颜色再调用begin_fill()绘制封闭图形最后调用end_fill()。turtle.color(black, #FFD700) turtle.begin_fill() # 绘制一个圆 turtle.circle(100) turtle.end_fill()color(black, #FFD700)中第一个参数是画笔颜色第二个参数是填充颜色。begin_fill()和end_fill()必须成对出现否则填充不生效。3.4 用弧度组合椭圆turtle.circle(radius, extent)可以画圆弧。如果连续画四段不同半径的圆弧就能得到一个近似椭圆。很多绘制皮卡丘的示例都会封装一个椭圆函数def ellipse(rx, ry): for _ in range(2): turtle.circle(rx, 90) turtle.circle(ry, 90)这个函数每循环一次画两个 90 度圆弧循环两次刚好旋转 360 度最终围成一个近似椭圆。rx和ry控制椭圆在不同方向上的半径如果rx ry得到的是横向椭圆如果rx ry得到的是纵向椭圆。这个技巧在绘制耳朵、身体、手臂和腿时非常关键。4. 皮卡丘绘制实战下面进入核心部分。为了让代码可读性更强我们把皮卡丘拆成若干函数每个函数负责绘制一个部件。这种写法也符合工程上的“单一职责”思想。4.1 初始化窗口首先定义一个窗口初始化函数import turtle def init_window(): turtle.setup(800, 600) turtle.title(皮卡丘我们来咯 - Python Turtle) turtle.bgcolor(#87CEEB) turtle.speed(5) turtle.pensize(2)这里的背景色用了浅蓝色用来模拟天空。pensize(2)让轮廓线稍微粗一点视觉效果更好。为了后面方便查看绘制过程我们可以先用turtle.tracer(0)关闭自动刷新等全部绘制完再turtle.update()一次性刷新。但为了保留“一笔一笔画出来”的观赏性本文先不开启这个优化你在运行时会看到皮卡丘逐步被画出来的过程。4.2 创建椭圆工具函数接下来定义椭圆函数后面绘制身体、腿和耳朵都会用到def ellipse(rx, ry): for _ in range(2): turtle.circle(rx, 90) turtle.circle(ry, 90)注意这个函数会改变海龟的位置最终回到起点。所以每次绘制椭圆前先用turtle.penup()移动到合适起点再调用这个函数。4.3 绘制尾巴尾巴是整个皮卡丘最靠后、最靠右的部分所以先画。这里用一个锯齿形多边形模拟皮卡丘标志性的闪电尾巴def draw_tail(): turtle.penup() turtle.goto(75, -65) turtle.pendown() turtle.color(black, #FFD700) turtle.begin_fill() turtle.goto(150, -55) turtle.goto(120, -25) turtle.goto(195, -15) turtle.goto(165, -75) turtle.goto(110, -60) turtle.end_fill()坐标不是凭空来的它表示尾巴从身体右侧向斜上方延伸中间形成锯齿。初学者在调整这类坐标时可以先画一版再看效果微调goto中的数值。4.4 绘制腿和脚皮卡丘的两条腿在身体下方用横向椭圆来表示。定义一个通用的绘制腿函数def draw_leg(x, y): turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color(black, #FFD700) turtle.begin_fill() ellipse(30, 18) turtle.end_fill()函数中的x、y决定腿的位置。左腿在x-45附近右腿在x45附近两条腿都在y-170附近。调用方式如下draw_leg(-45, -170) draw_leg(45, -170)因为ellipse函数画完后海龟回到起点所以两条腿之间不会互相干扰。4.5 绘制身体身体是皮卡丘的主要躯干用横向大椭圆表示。绘制时要注意头部画完会盖住身体上缘所以身体先画头后画。def draw_body(): turtle.penup() turtle.goto(-95, -100) turtle.pendown() turtle.color(black, #FFD700) turtle.begin_fill() ellipse(95, 70) turtle.end_fill()起点选择在(-95, -100)相当于椭圆最左侧点。这样ellipse(95, 70)会画出一个横着的大椭圆中心和大约在(0, -100)。4.6 绘制手臂手臂用纵向椭圆表示。为了让手臂更靠近身体两侧起点选择在身体左右边缘附近def draw_arm(x, y): turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.setheading(90) turtle.color(black, #FFD700) turtle.begin_fill() ellipse(18, 42) turtle.end_fill()这里之所以先setheading(90)是为了让后续ellipse画出的椭圆方向是纵向的。如果不设置方向默认横向椭圆看起来就不太像手臂。调用方式draw_arm(-95, -75) draw_arm(95, -75)4.7 绘制头部皮卡丘的头是一个很大的圆。圆心的设计非常重要它决定头部和身体的位置关系def draw_head(): turtle.penup() turtle.goto(0, -80) turtle.pendown() turtle.color(black, #FFD700) turtle.begin_fill() turtle.circle(130) turtle.end_fill()这里goto(0, -80)表示移动到圆的底部点再circle(130)画半径 130 的圆。因此圆心位置是(0, 50)头部下边缘在y-80上边缘在y180。身体顶部在y-30左右头部下缘会和身体上缘重叠形成自然衔接。4.8 绘制耳朵皮卡丘的耳朵是细长的并且有黑色耳尖。这里用“倾斜椭圆 黑色圆”来实现。def draw_ear(x, y, heading): turtle.penup() turtle.goto(x, y) turtle.setheading(heading) turtle.pendown() turtle.color(black, #FFD700) turtle.begin_fill() ellipse(28, 90) turtle.end_fill() # 黑色耳尖 turtle.penup() turtle.forward(85) turtle.pendown() turtle.color(black, black) turtle.begin_fill() turtle.circle(22) turtle.end_fill()这个函数的实现思路是在头部上方的左右两侧落点。通过heading控制耳朵的倾斜方向。用ellipse(28, 90)画一个细长的椭圆。画完后海龟会回到起点并且方向保持不变。forward(85)沿着耳朵方向走到靠近尖端的位置画一个黑色圆作为耳尖。左右耳朵调用方式draw_ear(-85, 115, 135) draw_ear(85, 115, 45)135表示左上方向45表示右上方向。4.9 绘制眼睛眼睛由黑色圆和白色高光组成。高光能让眼睛看起来很亮是卡通角色绘制中非常关键的一笔。def draw_eye(x, y): # 黑色眼珠 turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color(black, black) turtle.begin_fill() turtle.circle(18) turtle.end_fill() # 白色高光 turtle.penup() turtle.goto(x - 5, y 18 8 - 6) turtle.pendown() turtle.color(white, white) turtle.begin_fill() turtle.circle(6) turtle.end_fill()这里turtle.circle(18)的起点是圆底部所以眼睛圆心大约在(x, y18)。白色高光要放在眼睛的左上区域所以 x 减 5y 加 20 左右。调用方式draw_eye(-45, 95) draw_eye(45, 95)4.10 绘制脸颊皮卡丘标志性的红色脸颊用两个红色圆实现def draw_cheek(x, y): turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color(black, #FF6A6A) turtle.begin_fill() turtle.circle(20) turtle.end_fill()调用方式draw_cheek(-70, 55) draw_cheek(70, 55)4.11 绘制鼻子和嘴巴皮卡丘的鼻子很小嘴巴像一个大写 W。鼻子可以用一个小圆点表示def draw_nose(): turtle.penup() turtle.goto(0, 48) turtle.pendown() turtle.color(black, black) turtle.begin_fill() turtle.circle(4) turtle.end_fill()嘴巴用折线画一个 W 形def draw_mouth(): turtle.penup() turtle.goto(-20, 28) turtle.pendown() turtle.color(black) turtle.pensize(3) turtle.goto(-10, 38) turtle.goto(0, 28) turtle.goto(10, 38) turtle.goto(20, 28) turtle.pensize(2)5. 完整代码与运行验证5.1 完整代码将上面的函数按绘制顺序整合到一个脚本中完整代码如下import turtle def init_window(): turtle.setup(800, 600) turtle.title(皮卡丘我们来咯 - Python Turtle) turtle.bgcolor(#87CEEB) turtle.speed(5) turtle.pensize(2) def ellipse(rx, ry): for _ in range(2): turtle.circle(rx, 90) turtle.circle(ry, 90) def draw_tail(): turtle.penup() turtle.goto(75, -65) turtle.pendown() turtle.color(black, #FFD700) turtle.begin_fill() turtle.goto(150, -55) turtle.goto(120, -25) turtle.goto(195, -15) turtle.goto(165, -75) turtle.goto(110, -60) turtle.end_fill() def draw_leg(x, y): turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color(black, #FFD700) turtle.begin_fill() ellipse(30, 18) turtle.end_fill() def draw_body(): turtle.penup() turtle.goto(-95, -100) turtle.pendown() turtle.color(black, #FFD700) turtle.begin_fill() ellipse(95, 70) turtle.end_fill() def draw_arm(x, y): turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.setheading(90) turtle.color(black, #FFD700) turtle.begin_fill() ellipse(18, 42) turtle.end_fill() def draw_head(): turtle.penup() turtle.goto(0, -80) turtle.pendown() turtle.color(black, #FFD700) turtle.begin_fill() turtle.circle(130) turtle.end_fill() def draw_ear(x, y, heading): turtle.penup() turtle.goto(x, y) turtle.setheading(heading) turtle.pendown() turtle.color(black, #FFD700) turtle.begin_fill() ellipse(28, 90) turtle.end_fill() turtle.penup() turtle.forward(85) turtle.pendown() turtle.color(black, black) turtle.begin_fill() turtle.circle(22) turtle.end_fill() def draw_eye(x, y): turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color(black, black) turtle.begin_fill() turtle.circle(18) turtle.end_fill() turtle.penup() turtle.goto(x - 5, y 18 8 - 6) turtle.pendown() turtle.color(white, white) turtle.begin_fill() turtle.circle(6) turtle.end_fill() def draw_cheek(x, y): turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color(black, #FF6A6A) turtle.begin_fill() turtle.circle(20) turtle.end_fill() def draw_nose(): turtle.penup() turtle.goto(0, 48) turtle.pendown() turtle.color(black, black) turtle.begin_fill() turtle.circle(4) turtle.end_fill() def draw_mouth(): turtle.penup() turtle.goto(-20, 28) turtle.pendown() turtle.color(black) turtle.pensize(3) turtle.goto(-10, 38) turtle.goto(0, 28) turtle.goto(10, 38) turtle.goto(20, 28) turtle.pensize(2) def main(): init_window() draw_tail() draw_leg(-45, -170) draw_leg(45, -170) draw_body() draw_arm(-95, -75) draw_arm(95, -75) draw_head() draw_ear(-85, 115, 135) draw_ear(85, 115, 45) draw_eye(-45, 95) draw_eye(45, 95) draw_cheek(-70, 55) draw_cheek(70, 55) draw_nose() draw_mouth() turtle.hideturtle() turtle.exitonclick() if __name__ __main__: main()5.2 运行方式将上面的代码保存为pikachu.py在命令行执行python pikachu.py执行后会出现一个浅蓝色背景的窗口你会看到海龟依次画出尾巴、腿、身体、手臂、头部、耳朵、眼睛、脸颊、鼻子和嘴巴。全部绘制完成后皮卡丘会停留在窗口中点击任意位置即可关闭窗口。5.3 代码设计说明整个代码设计遵循了几个原则每个部件一个函数命名直接。重复部件通过参数复用比如draw_leg(x, y)、draw_ear(x, y, heading)。全局坐标尽可能保持一致避免计算混乱。main()函数控制绘制顺序先画在后面的部件再画在前的部件。如果你第一次运行后觉得某个部位的位置不理想可以直接修改对应函数里的坐标参数不需要改动其他函数。6. 常见问题与排查思路6.1 窗口一闪而过问题现象常见原因解决思路绘制完成后窗口立即关闭脚本结束导致进程退出在最后添加turtle.exitonclick()或turtle.mainloop()turtle.exitonclick()会让程序等待鼠标点击后再退出这是最简单有效的解决方案。6.2 画面没有填充颜色问题现象常见原因解决思路只有轮廓没有填充色begin_fill()和end_fill()不配对或图形未闭合检查每个填充块是否成对出现并保证路径连续特别是自己修改goto坐标时很容易让图形无法闭合。建议先在草稿纸上画出坐标再填代码。6.3 绘制速度太慢问题现象常见原因解决思路动画过程很慢speed设置较低或线段太多调高speed或使用turtle.tracer(0)turtle.update()如果想要提高运行速度可以在init_window()中加入turtle.tracer(0)然后在main()末尾、turtle.exitonclick()之前加入turtle.update()这样画面不会逐步显示而是直接刷新最终效果。6.4 图形超出窗口范围问题现象常见原因解决思路部分图形跑到窗口外坐标设计过大增加turtle.setup(900, 700)或整体缩小坐标6.5 颜色值不生效问题现象常见原因解决思路颜色看起来不对或者没有变化颜色名称拼写错误或未区分文字颜色和填充颜色使用color(pencolor, fillcolor)双参数形式7. 最佳实践与工程建议7.1 使用函数拆分模块很多初学者喜欢把所有绘制代码写在一个巨型循环里结果后面调整一个点位整个代码都要重看。更合理的做法是像本文这样每个部件一个函数甚至可以把函数放到单独的模块文件中。这样哪怕以后要画别的角色也可以复用ellipse()、draw_leg()这类通用函数。7.2 用颜色常量代替魔法值代码中直接写#FFD700也可以但如果多处使用建议定义常量YELLOW #FFD700 RED #FF6A6A BLACK black WHITE white这样后续如果要换配色只需要修改常量定义。7.3 先规划坐标系再动手写代码这是最容易忽略但最重要的一点。建议在实际绘制之前先画一张坐标草图把每个部件的大致位置标出来。比如本文的坐标规划大致如下头部中心约 (0, 50) 耳朵根部约 (-85