【零依赖实现】用Python海龟库绘制哆啦A梦与皮卡丘:从0到1的图形编程指南
你还在为Python图形编程入门找不到有趣案例而烦恼吗?尝试过的教程要么太简单只是画个正方形,要么依赖复杂第三方库难以配置?本文将带你用Python标准库中的Turtle(海龟绘图)模块,从零开始实现两个经典卡通形象——哆啦A梦与皮卡丘的绘制,全程无需安装任何额外依赖,只需15分钟即可完成第一个作品。
读完本文你将获得:
- 掌握Turtle库核心绘图函数(移动、旋转、填充等)的实战应用
- 学会复杂图形的模块化分解方法(从局部到整体的构建思路)
- 理解坐标系统与几何变换在图形绘制中的具体运用
- 两个可直接运行的完整项目代码(含详细注释)
- 5个进阶优化方向,让你的作品从"能看"到"惊艳"
项目概述:用基础库创造视觉奇迹
Python-Painting-Doraemon项目是一个基于Turtle库的图形绘制应用,它展示了如何仅使用Python标准库,通过精确的几何计算和模块化设计,实现复杂卡通形象的绘制。项目包含两个核心文件:
Doraemon.py:绘制哆啦A梦(机器猫)的完整实现Pikachu.py:绘制皮卡丘的面向对象实现
Turtle库(海龟绘图)是Python标准库中的一个可视化模块,它模拟了一只拖着画笔的小乌龟在平面坐标系中移动,通过控制乌龟的动作来绘制图形。虽然看似简单,但它能实现从基础几何图形到复杂卡通形象的各种绘制任务,是编程入门和图形思维培养的理想工具。
mindmap
root((Turtle库))
核心概念
画布(Canvas)
画笔(Pen)
坐标系
状态控制
基础操作
移动(goto/fd/bk)
旋转(lt/rt/seth)
画笔控制(penup/pendown)
颜色填充(begin_fill/end_fill)
高级技巧
循环绘制
函数封装
类与对象
动画控制
环境准备:零依赖快速启动
本项目具有极简的环境要求,因为Turtle库是Python标准库的一部分,无需额外安装任何依赖包。
系统要求
- Python 3.6+(推荐3.8及以上版本)
- 支持Tkinter的Python环境(通常标准安装已包含)
快速开始步骤
- 获取项目代码
git clone https://gitcode.com/gh_mirrors/py/Python-Painting-Doraemon
cd Python-Painting-Doraemon
- 运行哆啦A梦绘制程序
python Doraemon.py
- 运行皮卡丘绘制程序
python Pikachu.py
⚠️ 注意:如果遇到"Tkinter not found"错误,请安装对应的系统依赖:
- Ubuntu/Debian:
apt-get install python3-tk- CentOS/RHEL:
yum install python3-tkinter- Windows/macOS: 重新安装Python并勾选"Tkinter"组件
哆啦A梦绘制详解:从几何图形到卡通形象
哆啦A梦的绘制采用了函数式编程思想,将整体形象分解为多个独立的部件(头部、脸、眼睛、嘴巴等),每个部件由专门的函数实现。这种模块化设计使代码结构清晰,便于维护和扩展。
核心绘制流程
哆啦A梦的绘制遵循"从整体到局部"的原则,先绘制大致轮廓,再逐步添加细节。主要流程如下:
flowchart TD
A[初始化画布] --> B[绘制头部轮廓]
B --> C[绘制围巾]
C --> D[绘制脸部]
D --> E[绘制五官]
E --> F[绘制身体]
F --> G[添加细节装饰]
G --> H[完成并显示]
关键技术点解析
1. 无轨迹跳跃函数
在绘制不同部件时,需要将画笔移动到新的位置,但不希望留下移动轨迹。my_goto函数封装了这一常用操作:
# 无轨迹跳跃
def my_goto(x, y):
penup() # 抬起画笔,移动时不绘制
goto(x, y) # 移动到指定坐标
pendown() # 放下画笔,准备绘制
2. 曲线绘制技巧
哆啦A梦的眼睛采用了平滑曲线设计,通过循环动态调整步长实现:
def eyes():
fillcolor("#ffffff")
begin_fill()
tracer(False) # 关闭动画,加快绘制速度
a = 2.5 # 初始步长
for i in range(120):
if 0 <= i < 30 or 60 <= i < 90:
a -= 0.05 # 前30度和60-90度减小步长
lt(3) # 左转3度
fd(a) # 前进a个单位
else:
a += 0.05 # 其他角度增加步长
lt(3)
fd(a)
tracer(True) # 打开动画
end_fill()
这段代码通过120次小角度旋转(每次3度,共360度)和动态调整步长,绘制出了一个近似椭圆形的眼睛轮廓。这种"小步微调"技术是Turtle库绘制复杂曲线的基础。
3. 模块化构建头部
头部是哆啦A梦最具特征的部分,由蓝色头部轮廓、白色脸部、红色鼻子和胡须等组成:
# 头型
def head():
penup()
circle(150, 40) # 移动到起始位置
pendown()
fillcolor('#00a0de') # 哆啦A梦蓝
begin_fill()
circle(150, 280) # 绘制头部主体轮廓
end_fill()
# 脸
def face():
fd(183)
lt(45)
fillcolor('#ffffff') # 脸部白色
begin_fill()
circle(120, 100) # 绘制右侧脸部曲线
seth(180)
fd(121)
pendown()
seth(215)
circle(120, 100) # 绘制左侧脸部曲线
end_fill()
# 绘制眼睛(左右各一个)
my_goto(63.56,218.24)
seth(90)
eyes()
seth(180)
penup()
fd(60)
pendown()
seth(90)
eyes()
完整代码与注释
以下是哆啦A梦绘制的核心函数调用流程,完整代码可在项目文件Doraemon.py中查看:
def Doraemon():
# 头部
head()
# 围脖
scarf()
# 脸
face()
# 红鼻子
nose()
# 嘴巴
mouth()
# 胡须
beard()
# 身体(包含躯干、手脚、口袋等)
# ...省略身体绘制代码...
# 铃铛
# ...省略铃铛绘制代码...
# 眼睛细节
black_eyes()
if __name__ == '__main__':
screensize(800,600, "#f0f0f0") # 设置画布大小和背景色
pensize(3) # 画笔宽度
speed(9) # 画笔速度(1-10,10最快)
Doraemon() # 调用绘制函数
my_goto(100, -300) # 移动到签名位置
write('by dongdong', font=("Bradley Hand ITC", 30, "bold")) # 添加签名
mainloop() # 保持窗口打开
皮卡丘绘制详解:面向对象的图形设计
相比哆啦A梦的函数式实现,皮卡丘的绘制采用了面向对象编程(OOP)思想,将所有绘制相关的方法和状态封装在Pikachu类中,使代码更具可维护性和可扩展性。
类结构设计
Pikachu类的核心结构如下:
classDiagram
class Pikachu {
- t: Turtle
+ __init__()
+ noTrace_goto(x, y)
+ leftEye(x, y)
+ rightEye(x, y)
+ mouth(x, y)
+ leftCheek(x, y)
+ rightCheek(x, y)
+ colorLeftEar(x, y)
+ colorRightEar(x, y)
+ body()
+ cap(x, y)
+ start()
}
关键技术点解析
1. 类的初始化
在__init__方法中,我们创建了Turtle对象并进行了基本设置:
def __init__(self):
self.t = turtle.Turtle() # 创建海龟对象
t = self.t
t.pensize(3) # 设置画笔宽度
t.speed(9) # 设置绘制速度
t.ondrag(getPosition) # 允许拖拽(调试用)
2. 复杂路径绘制
皮卡丘的身体轮廓比哆啦A梦更加复杂,包含了曲线、圆弧和直线的多种组合:
def body(self):
t = self.t
t.fillcolor('#F6D02F') # 皮卡丘黄色
t.begin_fill()
# 右脸轮廓
t.penup()
t.circle(130, 40)
t.pendown()
t.circle(100, 105)
t.left(180)
t.circle(-100, 5)
# 右耳朵
t.seth(20)
t.circle(300, 30)
t.circle(30, 50)
t.seth(190)
t.circle(300, 36)
# 上轮廓
t.seth(150)
t.circle(150, 70)
# 左耳朵
t.seth(200)
t.circle(300, 40)
t.circle(30, 50)
t.seth(20)
t.circle(300, 35)
# ...省略剩余轮廓绘制代码...
t.end_fill()
这段代码展示了如何通过组合circle()函数的不同用法(指定半径和角度)来绘制复杂曲线。circle(radius, extent)函数可以绘制指定半径和角度的圆弧,当半径为正时,逆时针绘制;为负时,顺时针绘制。
3. 高级填充技巧
皮卡丘的嘴巴和脸颊采用了更复杂的填充路径,通过记录和复用坐标点实现:
def mouth(self, x, y):
self.noTrace_goto(x, y)
t = self.t
t.fillcolor('#88141D') # 嘴巴红色
t.begin_fill()
# 下嘴唇 - 记录左侧曲线坐标
l1 = []
t.seth(190)
a = 0.7
for i in range(28):
a += 0.1
t.right(3)
t.fd(a)
l1.append(t.position()) # 记录每个点坐标
# 下嘴唇 - 绘制右侧曲线并记录坐标
self.noTrace_goto(x, y)
l2 = []
t.seth(10)
a = 0.7
for i in range(28):
a += 0.1
t.left(3)
t.fd(a)
l2.append(t.position()) # 记录每个点坐标
# 上嘴唇
t.seth(10)
t.circle(50, 15)
t.left(180)
t.circle(-50, 15)
t.circle(-50, 40)
t.seth(233)
t.circle(-50, 55)
t.left(180)
t.circle(50, 12.1)
t.end_fill()
# 舌头 - 复用之前记录的坐标点
self.noTrace_goto(17, 54)
t.fillcolor('#DD716F') # 舌头粉红色
t.begin_fill()
t.seth(145)
t.circle(40, 86)
t.penup()
# 连接左侧曲线点
for pos in reversed(l1[:20]):
t.goto(pos[0], pos[1]+1.5)
# 连接右侧曲线点
for pos in l2[:20]:
t.goto(pos[0], pos[1]+1.5)
t.pendown()
t.end_fill()
这种"记录-复用"坐标点的技术,是实现复杂封闭区域填充的有效方法,特别适用于绘制像嘴巴、脸颊这类非标准几何形状。
对比分析:两种编程范式的实践
哆啦A梦和皮卡丘的绘制分别采用了函数式和面向对象两种不同的编程范式,各有特点和适用场景:
| 特性 | 哆啦A梦实现(函数式) | 皮卡丘实现(面向对象) |
|---|---|---|
| 代码组织 | 按部件功能划分函数 | 所有功能封装在类中 |
| 状态管理 | 依赖全局Turtle状态 | 通过实例变量管理状态 |
| 可复用性 | 中等(需手动协调函数调用) | 高(可创建多个独立实例) |
| 扩展性 | 需修改全局函数 | 可通过继承扩展功能 |
| 复杂度 | 较低,适合简单图形 | 较高,适合复杂图形 |
| 学习曲线 | 平缓,易于理解 | 稍陡,需理解类和对象 |
函数式实现更适合初学者入门和简单图形绘制,代码直观且易于跟踪执行流程;而面向对象实现更适合复杂图形和大型项目,它提供了更好的封装性和代码组织方式,便于维护和扩展。
进阶优化:让你的作品更上一层楼
完成基础绘制后,你可以尝试以下优化方向,提升作品质量和用户体验:
1. 添加动画效果
通过调整tracer()和sleep()函数,为绘制过程添加动画效果:
from time import sleep
# 在关键部件绘制后添加短暂停顿
def Doraemon():
head()
tracer(True)
sleep(0.5) # 头部绘制完成后暂停0.5秒
tracer(False)
scarf()
tracer(True)
sleep(0.3)
tracer(False)
# ...其他部件类似...
2. 实现交互功能
利用Turtle库的事件处理机制,添加简单的交互功能:
def on_click(x, y):
# 点击屏幕不同区域显示不同信息
if -100 < x < 100 and -100 < y < 100:
write("你点击了哆啦A梦的肚子!", align="center", font=("Arial", 12, "normal"))
# 绑定鼠标点击事件
onscreenclick(on_click)
3. 颜色优化
调整颜色参数,实现更精美的视觉效果:
# 哆啦A梦蓝色优化(更接近官方色值)
fillcolor('#0078D7') # 原代码为'#00a0de'
# 皮卡丘黄色优化
fillcolor('#FFCB05') # 原代码为'#F6D02F'
4. 分辨率提升
调整画布大小和坐标比例,生成更高分辨率的图像:
# 设置更大的画布
screensize(1200, 900, "#f0f0f0")
# 按比例调整所有坐标值(需整体修改代码)
SCALE = 1.5 # 缩放因子
def my_goto(x, y):
penup()
goto(x * SCALE, y * SCALE) # 应用缩放
pendown()
5. 保存为图片
添加将绘制结果保存为图片文件的功能:
from PIL import ImageGrab # 需要安装Pillow库
# 在mainloop前添加
def save_drawing():
# 获取画布区域并保存
canvas = getscreen().getcanvas()
canvas.postscript(file="doraemon.eps") # 保存为EPS矢量图
# 可选:转换为PNG
img = ImageGrab.grab(bbox=(100, 100, 800, 600)) # 根据实际窗口调整坐标
img.save("doraemon.png")
# 添加快捷键保存
onkey(save_drawing, "s") # 按"s"键保存
listen() # 开始监听键盘事件
常见问题与解决方案
Q1: 程序运行时出现空白窗口或闪退
可能原因:
- Tkinter库未正确安装
- 屏幕分辨率不兼容
- Python版本过低
解决方案:
# 检查并安装Tkinter
python -m tkinter
# 如果报错,执行以下命令安装
# Ubuntu/Debian
sudo apt-get install python3-tk
# CentOS/RHEL
sudo yum install python3-tkinter
Q2: 绘制速度太慢
优化方案:
- 提高speed参数值(最大为10)
- 使用
tracer(False)关闭实时绘制,完成后再tracer(True) - 减少不必要的坐标打印和调试输出
# 优化前
speed(5)
# 优化后
tracer(False) # 关闭动画
speed(0) # 设置最快速度
# ...绘制代码...
tracer(True) # 打开动画,一次性显示结果
update() # 强制更新画布
Q3: 中文字体显示异常
解决方案: 修改文字绘制部分的字体设置,使用系统支持的中文字体:
# 原代码
write('by dongdong', font=("Bradley Hand ITC", 30, "bold"))
# 修改为支持中文的字体
write('绘制完成', font=("SimHei", 20, "normal")) # 黑体
# 或
write('绘制完成', font=("Microsoft YaHei", 20, "normal")) # 微软雅黑
总结与展望
通过本文的学习,你不仅掌握了Turtle库的核心用法,还实践了两种不同的编程范式(函数式和面向对象)在图形绘制中的应用。从哆啦A梦的模块化函数设计到皮卡丘的类封装实现,我们展示了如何将复杂问题分解为可管理的小任务,并通过组合简单图形基元来构建复杂形象。
这个项目虽然简单,但包含了图形编程的基本思想:复杂图形 = 基本元素 + 组合规则。这种思想不仅适用于Turtle库,也适用于其他图形编程领域,如计算机图形学、游戏开发和数据可视化。
未来你可以尝试:
- 将两个绘制功能整合到一个程序中,添加角色选择界面
- 实现更多卡通形象的绘制(如Hello Kitty、米老鼠等)
- 结合OpenCV库,实现摄像头实时互动效果
- 将绘制过程导出为GIF动画文件
图形编程是编程学习中最有趣的部分之一,它能将抽象的代码转化为直观的视觉效果,带来即时的成就感。希望本教程能激发你对Python图形编程的兴趣,探索更多创意可能!
完整项目代码可通过以下方式获取:
git clone https://gitcode.com/gh_mirrors/py/Python-Painting-Doraemon
附录:Turtle库常用函数速查表
| 类别 | 函数 | 描述 |
|---|---|---|
| 移动 | forward(d) / fd(d) |
向前移动d个像素 |
| 移动 | backward(d) / bk(d) |
向后移动d个像素 |
| 移动 | goto(x, y) |
移动到坐标(x,y) |
| 移动 | home() |
移动到原点(0,0) |
| 旋转 | left(angle) / lt(angle) |
向左旋转angle度 |
| 旋转 | right(angle) / rt(angle) |
向右旋转angle度 |
| 旋转 | setheading(angle) / seth(angle) |
设置朝向angle度 |
| 画笔 | penup() / pu() |
抬起画笔,移动不绘制 |
| 画笔 | pendown() / pd() |
放下画笔,移动绘制 |
| 画笔 | pensize(width) / width(width) |
设置画笔宽度 |
| 画笔 | pencolor(color) |
设置画笔颜色 |
| 填充 | begin_fill() |
开始填充 |
| 填充 | end_fill() |
结束填充 |
| 填充 | fillcolor(color) |
设置填充颜色 |
| 其他 | circle(radius, extent=None) |
绘制圆形或圆弧 |
| 其他 | dot(size=None, color=None) |
绘制圆点 |
| 其他 | write(text, font=None, align="left") |
绘制文字 |
| 控制 | speed(s) |
设置绘制速度(0-10) |
| 控制 | tracer(flag) |
控制是否显示绘制过程 |
| 控制 | mainloop() / done() |
启动主事件循环 |
kernelopenEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。C0100
baihu-dataset异构数据集“白虎”正式开源——首批开放10w+条真实机器人动作数据,构建具身智能标准化训练基座。00
mindquantumMindQuantum is a general software library supporting the development of applications for quantum computation.Python059
PaddleOCR-VLPaddleOCR-VL 是一款顶尖且资源高效的文档解析专用模型。其核心组件为 PaddleOCR-VL-0.9B,这是一款精简却功能强大的视觉语言模型(VLM)。该模型融合了 NaViT 风格的动态分辨率视觉编码器与 ERNIE-4.5-0.3B 语言模型,可实现精准的元素识别。Python00
GLM-4.7GLM-4.7上线并开源。新版本面向Coding场景强化了编码能力、长程任务规划与工具协同,并在多项主流公开基准测试中取得开源模型中的领先表现。 目前,GLM-4.7已通过BigModel.cn提供API,并在z.ai全栈开发模式中上线Skills模块,支持多模态任务的统一规划与协作。Jinja00
AgentCPM-Explore没有万亿参数的算力堆砌,没有百万级数据的暴力灌入,清华大学自然语言处理实验室、中国人民大学、面壁智能与 OpenBMB 开源社区联合研发的 AgentCPM-Explore 智能体模型基于仅 4B 参数的模型,在深度探索类任务上取得同尺寸模型 SOTA、越级赶上甚至超越 8B 级 SOTA 模型、比肩部分 30B 级以上和闭源大模型的效果,真正让大模型的长程任务处理能力有望部署于端侧。Jinja00