免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

Python turtle绘图实战:用代码绘制皮卡丘,掌握图形学基础与动画控制

Python turtle绘图实战:用代码绘制皮卡丘,掌握图形学基础与动画控制 最近在整理桌面上的小项目时突然想起Python里那个自带的小海龟绘图库turtle于是做了个很“童年”的练习——用代码画一只皮卡丘。很多人以为turtle只能画点基础几何图形其实只要把数学函数和绘图API结合起来就能画出结构完整的卡通形象。这篇文章我会完整拆解从思路拆解、代码实现到动画增强的全过程零基础也能跟着一步步敲出来适合Python入门、游戏图形学启蒙以及想用代码做点有趣小项目的读者。1. 为什么突然想用 Python 画出皮卡丘1.1 皮卡丘是谁“皮卡丘我们来咯”这句话自带画面感。皮卡丘是“宝可梦”系列中最具代表性的角色之一身体以黄色为主脸颊上有标志性的红色电气袋耳朵尖端是黑色整体造型圆润亲和非常适合用基础几何图形模拟。对开发者来说画皮卡丘不是目的真正的目的是借助这个辨识度很高的形象学习 Python 绘图、坐标计算、颜色填充、动画控制等一整串知识点。因为角色特征足够明显画得像不像一眼就能看出来非常适合作为编程练习的“验收标准”。1.2 turtle 绘图库是什么turtle 是 Python 标准库中自带的绘图工具最早源于 Logo 语言的教育理念。你可以把它想象成一只拿着画笔的小海龟在画布上爬行每走一步都会留下轨迹。turtle 本身不依赖第三方库安装 Python 后即可使用。它通常被用于少儿编程和 Python 入门教学简单图形绘制和数学函数可视化递归算法、分形图形演示小游戏的图形界面原型。虽然 turtle 不如 Matplotlib、Pygame 等库强大但它的优势是足够轻量、上手快特别适合理解“图形是怎么一笔一笔画出来的”。1.3 这个练习的学习价值画皮卡丘并不是一个纯娱乐项目。实际编码过程中你需要考虑如何把复杂的卡通形象拆解成基础的圆形、椭圆、多边形如何使用坐标系和角度控制画笔位置如何用填充颜色区分角色的不同部位如何通过函数封装提高代码复用性如何用定时器实现简单的动画效果。这些能力在后续学习 Pygame、OpenCV、数据可视化时都会用到。所以这篇文章虽然从“皮卡丘”切入但内容是以图形思维为核心的 Python 实战教程。2. 环境准备与版本说明2.1 运行环境本文示例以常见环境为例重点演示配置思路。具体版本需要根据你的项目实际情况调整。项目推荐环境操作系统Windows 10/11、Ubuntu 20.04、macOS 均可Python 版本Python 3.8 及以上turtle 库Python 标准库无需额外 pip 安装IDEPyCharm、VS Code、IDLE 均可图形支持需要 Tk 图形环境支持这里要特别说一下 Tk 环境。turtle 底层依赖 Tkinter 窗口如果你的 Python 环境是精简安装可能会出现找不到_tkinter的情况。2.2 安装与验证Windows 用户在 python.org 下载完整版安装包时通常已经包含 Tkinter。Ubuntu 用户如果使用系统自带的 Python 3可以通过以下命令补装sudo apt update sudo apt install python3-tk安装完成后在命令行执行一段最简单的代码验证import turtle screen turtle.Screen() screen.title(皮卡丘测试窗口) turtle.done()如果弹出一个空白窗口说明 turtle 环境已就绪。如果提示ModuleNotFoundError: No module named tkinter那就是 Tk 环境缺失需要按照上面的命令安装。2.3 项目文件结构为了让代码更清晰本文采用单文件方式实现。可以直接在项目目录中新建pikachu.pypikachu-demo/ └── pikachu.py随着功能增加也可以拆分出draw_utils.py、pikachu_basic.py、pikachu_animation.py。不过本文先让代码足够直观用单文件把原理讲清楚后续扩展你再拆。3. turtle 绘图的核心机制3.1 画布与坐标系turtle 的画布默认是 400×300 像素坐标原点在画布中心。我们可以通过turtle.setup()调整窗口大小用turtle.screensize()设置画布大小。默认坐标系如下水平方向是 X 轴向右为正垂直方向是 Y 轴向上为正原点(0, 0)位于画布中央。在画皮卡丘之前先把画布设为 480×480方便后续坐标计算import turtle turtle.setup(480, 480) turtle.screensize(400, 400) turtle.speed(8)turtle.speed()的取值范围是 0 到 100 表示最快且不显示动画过程1 到 10 速度递增。3.2 画笔状态与颜色填充turtle 的画笔可以看作一个状态机常用操作包括操作说明penup()抬起画笔移动时不绘制pendown()落下画笔移动时绘制goto(x, y)移动到指定坐标color(yellow)设置画笔和填充颜色begin_fill()开始填充end_fill()结束填充circle(radius, extent)画圆或圆弧画一个带填充颜色的圆形基本组合如下import turtle turtle.penup() turtle.goto(0, -50) turtle.pendown() turtle.color(yellow) turtle.begin_fill() turtle.circle(50) turtle.end_fill() turtle.done()3.3 图形绘制原理椭圆函数皮卡丘的头部、眼睛、脸颊都不是标准正圆而是椭圆。turtle 没有内置的椭圆绘制函数但我们可以通过参数方程手动实现。椭圆的标准参数方程为x cx rx * cos(θ) y cy ry * sin(θ)其中(cx, cy)是椭圆中心rx是水平方向半轴长度ry是垂直方向半轴长度θ从 0 到 2π。我们可以在循环中逐步计算坐标点并让画笔依次经过这些点最终闭合形成椭圆。这个思路非常简单但很实用几乎可以封装成通用函数。4. 核心实战手绘皮卡丘的脸4.1 设计拆分画皮卡丘之前先把它拆解成几个基础部件头部一个偏大的黄色椭圆左耳黄色大耳朵尖端黑色右耳与左耳对称眼睛白色椭圆 黑色瞳孔 白色高光点脸颊两个红色椭圆嘴巴黑色圆弧曲线鼻子黑色小圆点。按照从后到前、从下到上的绘制顺序可以避免图形互相覆盖。绘制顺序建议先画耳朵位于头部后方再画头部主体然后画眼睛画脸颊最后画嘴巴和鼻子。4.2 工具函数实现先封装一个通用的椭圆绘制函数。为了让皮卡丘各部分能灵活定位函数接收中心坐标、宽高尺寸和颜色import turtle import math def draw_ellipse(cx, cy, rx, ry, color): turtle.penup() turtle.goto(cx rx, cy) turtle.pendown() turtle.color(color) turtle.begin_fill() for i in range(361): angle math.radians(i) x cx rx * math.cos(angle) y cy ry * math.sin(angle) turtle.goto(x, y) turtle.end_fill()这个函数的核心即参数方程。rx和ry决定椭圆形状color决定填充颜色。4.3 绘制耳朵皮卡丘的耳朵可以理解为一个黄色椭圆尖端加上一个黑色圆角三角形。为了简化这里用两个椭圆叠加实现def draw_left_ear(): draw_ellipse(-120, 120, 30, 80, yellow) draw_ellipse(-120, 170, 22, 35, black) def draw_right_ear(): draw_ellipse(120, 120, 30, 80, yellow) draw_ellipse(120, 170, 22, 35, black)听起来简单但要画出“尖耳朵”的感觉需要把黑色尖端的椭圆写得扁一些并且位置向上偏移。实际运行时会看到耳朵和头部结合得比较自然。4.4 绘制脸部基础脸部直接用大椭圆绘制颜色是黄色def draw_face(): draw_ellipse(0, 0, 130, 150, yellow)这一步是整个皮卡丘的底色相当于主体轮廓。4.5 绘制眼睛眼睛由三部分组成白色椭圆眼白黑色圆瞳孔白色高光点。代码如下def draw_eye(cx, cy): draw_ellipse(cx, cy, 24, 28, white) draw_ellipse(cx, cy - 4, 10, 14, black) draw_ellipse(cx 4, cy 4, 5, 6, white)这里高光点用小椭圆做让眼睛更有神采。4.6 绘制红脸颊脸颊位置在眼睛下方偏外侧两个红色椭圆def draw_cheek(cx, cy): draw_ellipse(cx, cy, 22, 16, red)这个大小在脸部比例如图时看起来比较协调。你可以根据自己的画布尺寸微调。4.7 绘制鼻子与嘴巴鼻子是一个黑色小圆点嘴巴可以用两条圆弧组合。turtle 的circle方法支持指定角度例如def draw_nose_and_mouth(): turtle.penup() turtle.goto(0, -20) turtle.dot(6, black) turtle.penup() turtle.goto(-30, -40) turtle.pendown() turtle.color(black) turtle.width(2) turtle.circle(30, 60) turtle.penup() turtle.goto(30, -40) turtle.pendown() turtle.circle(-30, 60)这里的turtle.circle(radius, extent)沿着圆弧绘制正负半径决定了弧线的弯曲方向。4.8 完整代码下面给出完整可运行的代码。这是核心实现把上面所有函数组合起来import turtle import math # 全局配置 turtle.setup(480, 480) turtle.screensize(400, 400) turtle.speed(8) def draw_ellipse(cx, cy, rx, ry, color): 绘制填充椭圆 turtle.penup() turtle.goto(cx rx, cy) turtle.pendown() turtle.color(color) turtle.begin_fill() for i in range(361): angle math.radians(i) x cx rx * math.cos(angle) y cy ry * math.sin(angle) turtle.goto(x, y) turtle.end_fill() def draw_left_ear(): draw_ellipse(-120, 120, 30, 80, yellow) draw_ellipse(-120, 170, 22, 35, black) def draw_right_ear(): draw_ellipse(120, 120, 30, 80, yellow) draw_ellipse(120, 170, 22, 35, black) def draw_face(): draw_ellipse(0, 0, 130, 150, yellow) def draw_eye(cx, cy): draw_ellipse(cx, cy, 24, 28, white) draw_ellipse(cx, cy - 4, 10, 14, black) draw_ellipse(cx 4, cy 4, 5, 6, white) def draw_cheek(cx, cy): draw_ellipse(cx, cy, 22, 16, red) def draw_nose_and_mouth(): # 鼻子 turtle.penup() turtle.goto(0, -20) turtle.dot(6, black) # 嘴巴 turtle.penup() turtle.goto(-30, -35) turtle.pendown() turtle.color(black) turtle.width(2) turtle.circle(30, 60) turtle.penup() turtle.goto(30, -35) turtle.pendown() turtle.circle(-30, 60) def draw_pikachu(): draw_left_ear() draw_right_ear() draw_face() draw_eye(-50, 50) draw_eye(50, 50) draw_cheek(-90, -30) draw_cheek(90, -30) draw_nose_and_mouth() turtle.hideturtle() if __name__ __main__: draw_pikachu() turtle.done()运行这段代码后你会看到一个由椭圆组成的皮卡丘脸部轮廓。这里需要提前说明由于手工坐标和椭圆叠加的限制它不会像官方立绘那么精细但五官结构和特征已经比较清晰作为图形学入门练习完全够用。5. 给皮卡丘增加动画效果5.1 眨眼动画静态图画完之后我们可以让皮卡丘“活”起来。最简单的动画是眨眼定时切换眼睛颜色。由于 turtle 绘制是逐步覆盖画布我们可以用一个全局函数定时清除并重绘眼睛区域。简化示例如下import turtle def blink(): draw_eye(-50, 50) draw_eye(50, 50) turtle.ontimer(blink, 2000)思路是每隔 2 秒重绘一次眼睛实现闪烁感觉。这里可以用turtle.ontimer()注册定时回调避免阻塞主线程。5.2 点头动画点头动画可以理解为头部整体绕固定点旋转但在 turtle 中旋转整个图形比较麻烦。一个更直观的替代方案是移动整个“头部” 所在图层的坐标位置通过turtle.clear()清除并重绘。完整重绘成本稍高适合演示但不适合复杂场景。初期学习阶段可以先用“耳朵抖动”代替def move_ear(): turtle.clear() draw_right_ear_offset(5) turtle.ontimer(move_ear, 500)实际项目中更推荐用 Pygame 等框架做角色动画turtle 的定位是教学演示。5.3 结合屏幕点击交互turtle 还可以监听鼠标事件让皮卡丘做出反应def reaction(x, y): print(f点击坐标: {x}, {y}) draw_cheek(-90, -30) draw_cheek(90, -30) turtle.onscreenclick(reaction) turtle.done()这是一个非常直观的交互方式适合放在少儿编程课程里使用。6. 常见问题与排查思路6.1 窗口一闪而过问题现象常见原因解决思路窗口打开后立即关闭没有调用turtle.done()在脚本最后调用turtle.done()或turtle.mainloop()命令行执行报错IDE 没有配置 Python 环境检查 Python 解释器路径没有图形窗口Tk 环境缺失Ubuntu 安装python3-tkWindows 安装完整版 Python6.2 画面绘制速度太慢如果代码中大量使用turtle.goto()逐点绘制椭圆会比较耗时。提高速度的方法turtle.tracer(0)tracer(0)会关闭逐帧动画直到调用turtle.update()时才一次性刷新。绘制结束后再调用一次turtle.update()即可。6.3 坐标位置跑偏手动写坐标时最容易出现图形不在预期位置的问题。建议先画一个网格底图或者在绘制时用turtle.write()打印当前坐标每画一个部位就运行一次观察位置调参时优先调整中心坐标(cx, cy)而不是直接改循环逻辑。6.4 学习建议刚开始不要追求一次画到位。建议先画出单个椭圆再逐个增加部件每次改动只调整一个参数这样能快速定位问题。7. 最佳实践与工程建议7.1 模块化绘制函数把每个部位封装成独立函数是图形程序中最基本的工程化思路。这样不仅便于复用也方便定位问题。如果你希望后续做更多角色这种拆分方式也更容易扩展。例如可以定义一个通用的角色绘制接口def draw_character(parts_config): for part in parts_config: draw_ellipse(part[cx], part[cy], part[rx], part[ry], part[color])使用数据驱动的方式来绘制不同角色代码可扩展性会高很多。7.2 坐标计算用公式替代硬编码皮卡丘的左右眼睛、左右耳朵其实都可以通过对称计算得到。比如def draw_eyes(base_x, base_y, offset): draw_eye(base_x - offset, base_y) draw_eye(base_x offset, base_y)这样只需要改一个offset参数就能调整双眼间距。7.3 画布尺寸自适应不同屏幕分辨率下固定像素坐标可能显示不全。更好的做法是预先计算画布中心再使用相对坐标center_x turtle.window_width() // 2 center_y turtle.window_height() // 2然后在绘制时基于center_x和center_y做偏移。7.4 封装绘制引擎如果只是画一个皮卡丘用函数就够了。但如果要做一个图形绘制工具建议封装一个DrawEngine类class DrawEngine: def draw_ellipse(self, cx, cy, rx, ry, color): # ... pass这种设计便于单元测试也方便后续替换为tkinter.Canvas或 Pygame 渲染后端。7.5 注意资源释放turtle 属于 GUI 程序在脚本结束或窗口关闭时最好显式调用turtle.bye()释放窗口资源。在生产脚本或自动化测试中也可以使用无界面模式。8. 总结与下一步计划这篇文章从“用 Python 画皮卡丘”这个趣味项目出发拆解了 turtle 绘图的完整流程环境准备、坐标系理解、椭圆参数方程、部件拆分、坐标组合再到动画和交互扩展。核心代码都是可以直接复制的建议你动手运行后按照自己的审美调整坐标和颜色。下一步可以尝试的方向把皮卡丘从脸部扩展到全身用turtle.Screen().bgcolor()添加背景结合random库做随机动画尝试用 pygame 实现更复杂的精灵动画学习 SVG 或 Canvas 的贝塞尔曲线将图形绘制方法迁移到 Web 前端。画图是一件重在练习的事。刚开始比例不好看很正常调几版后你会发现逐渐有“内味”了。如果这篇文章对你有帮助可以收藏备用动手敲一遍比只看效果要好得多。
返回列表