用Python给妈妈一个惊喜:手把手教你用turtle和matplotlib画动态爱心贺卡
用Python绘制动态爱心贺卡:给妈妈的编程式浪漫
母亲节、生日或是任何一个普通的日子,用代码亲手制作一张数字贺卡,或许是这个数字时代最独特的表达方式。当大多数人在社交平台转发千篇一律的祝福时,你却能打开电脑,用Python代码绘制出跳动的爱心和温暖的文字——这份专属的惊喜,会让妈妈感受到你投入的时间和心意。
Python作为一门既强大又友好的编程语言,让即使零基础的人也能快速上手创作出视觉效果。本文将带你从零开始,使用turtle和matplotlib这两个经典库,打造一张会"动"的爱心贺卡。不同于简单的文本输出,我们将实现:
- 用turtle模块手绘爱心轮廓并添加祝福语
- 通过matplotlib创建数学公式生成的标准爱心
- 结合两者优势,制作动态变化的爱心动画
- 最终导出为可分享的GIF或视频文件
1. 环境准备与基础概念
在开始编写爱心代码前,我们需要确保开发环境就绪。推荐使用Python 3.6及以上版本,这些库都已包含在标准库中,无需额外安装。
1.1 认识我们的"画笔":turtle模块
turtle是Python的标准库之一,它模拟了海龟在沙滩上爬行并留下痕迹的过程。这个诞生于1966年的概念,如今成为了编程入门的经典工具。它的特点包括:
- 直观可视化 :每一行代码都能立即看到图形变化
- 易于理解 :forward(100)表示前进100像素,left(90)表示左转90度
- 适合创意绘图 :可以自由控制画笔颜色、粗细和移动轨迹
import turtle
# 初始化画布
screen = turtle.Screen()
screen.bgcolor("white") # 设置背景色为白色
# 创建画笔
pen = turtle.Turtle()
pen.speed(1) # 设置绘制速度为慢速,方便观察
1.2 科学绘图利器:matplotlib
matplotlib是Python中最著名的数据可视化库,但它同样适合创建精确的数学图形。与turtle的手绘风格不同,matplotlib的优势在于:
- 基于数学方程 :可以精确控制每一个点的位置
- 丰富的样式选项 :线型、颜色、透明度等参数高度可定制
- 动画支持 :通过FuncAnimation可以实现平滑过渡效果
import matplotlib.pyplot as plt
import numpy as np
# 生成爱心曲线的参数方程
def heart_equation(t):
x = 16 * np.sin(t)**3
y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)
return x, y
2. 用turtle手绘爱心
让我们先从turtle开始,创建一个基础的爱心图案。这种方法虽然不够"数学精确",但更有手绘的温暖感。
2.1 爱心绘制函数分解
turtle绘制爱心的核心思路是将爱心分解为几个基本图形组合:
- 左侧的半圆
- 右侧的半圆
- 下方的尖角
- 填充颜色
def draw_heart(size, color):
pen.begin_fill()
pen.color(color)
pen.left(50)
pen.forward(size)
pen.circle(size/2, 180)
pen.right(90)
pen.circle(size/2, 180)
pen.forward(size)
pen.end_fill()
pen.setheading(0) # 重置方向
2.2 添加文字祝福
绘制完爱心后,我们可以在适当位置添加文字祝福。需要注意:
- 选择合适的字体和大小
- 计算好文字位置,避免与图形重叠
- 可以分多行显示不同内容
def add_text():
pen.penup()
pen.goto(0, -150) # 移动到爱心下方
pen.color("purple")
pen.write("妈妈", align="center", font=("楷体", 36, "bold"))
pen.goto(0, -200)
pen.write("节日快乐", align="center", font=("楷体", 28, "normal"))
2.3 完整turtle爱心代码
将上述函数组合起来,并添加一些美化效果:
import turtle
def setup():
screen = turtle.Screen()
screen.bgcolor("light pink")
pen = turtle.Turtle()
pen.speed(5)
pen.hideturtle()
return pen
def draw_heart(pen, size, color):
pen.begin_fill()
pen.color(color)
pen.left(50)
pen.forward(size)
pen.circle(size/2, 180)
pen.right(90)
pen.circle(size/2, 180)
pen.forward(size)
pen.end_fill()
pen.setheading(0)
def add_text(pen):
pen.penup()
pen.goto(0, -150)
pen.color("purple")
pen.write("妈妈", align="center", font=("楷体", 36, "bold"))
pen.goto(0, -200)
pen.write("我爱您", align="center", font=("楷体", 28, "normal"))
def main():
pen = setup()
draw_heart(pen, 100, "red")
add_text(pen)
turtle.done()
if __name__ == "__main__":
main()
3. 用matplotlib创建数学爱心
matplotlib可以生成更加精确的爱心曲线,这基于一个经典的参数方程。这种方法适合想要展示数学之美的情况。
3.1 爱心参数方程解析
爱心曲线的数学表达式为:
x = 16sin³θ
y = 13cosθ - 5cos2θ - 2cos3θ - cos4θ
其中θ在0到2π之间变化。这个方程会产生一个标准的爱心形状。
import numpy as np
import matplotlib.pyplot as plt
def heart_curve(t):
x = 16 * np.sin(t)**3
y = 13 * np.cos(t) - 5 * np.cos(2*t) - 2 * np.cos(3*t) - np.cos(4*t)
return x, y
t = np.linspace(0, 2*np.pi, 1000)
x, y = heart_curve(t)
3.2 美化爱心图形
matplotlib提供了丰富的自定义选项,我们可以:
- 调整线条粗细和颜色
- 添加填充色和透明度
- 设置坐标轴比例,确保爱心不变形
plt.figure(figsize=(8, 8))
plt.plot(x, y, color='red', linewidth=3)
plt.fill(x, y, 'pink', alpha=0.3) # 半透明填充
plt.axis('equal') # 确保x和y轴比例相同
plt.axis('off') # 隐藏坐标轴
plt.title('', fontsize=16)
plt.text(0, -3, '母亲节快乐', fontsize=24,
fontfamily='SimHei', ha='center')
plt.show()
3.3 创建3D爱心效果
通过增加z坐标,我们可以让爱心具有立体感:
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
z = np.linspace(0, 1, 1000)
ax.plot(x, y, z, color='red', linewidth=3)
ax.set_zlim(0, 2)
ax.axis('off')
plt.show()
4. 制作动态爱心动画
静态爱心已经很美,但如果能让它"跳动"起来,会更加生动。我们将结合两种方法创建动画效果。
4.1 使用turtle实现简单动画
turtle本身支持简单的动画效果,我们可以让爱心逐渐变大或改变颜色:
def animate_heart():
colors = ['red', 'pink', 'purple', 'hot pink']
for i in range(36): # 旋转36次,每次10度
pen.clear()
draw_heart(80 + i*2, colors[i%4])
add_text()
pen.right(10)
4.2 使用matplotlib创建高级动画
matplotlib的FuncAnimation功能可以创建更复杂的动画。下面是一个爱心从小到大、颜色变化的例子:
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots(figsize=(8, 8))
ax.set_xlim(-20, 20)
ax.set_ylim(-20, 15)
ax.axis('off')
line, = ax.plot([], [], 'red', lw=3)
fill = ax.fill([], [], 'pink', alpha=0.3)[0]
def init():
line.set_data([], [])
return line,
def update(frame):
t = np.linspace(0, 2*np.pi, 1000)
scale = 0.5 + 0.5 * np.sin(frame * np.pi / 15) # 跳动效果
x, y = heart_curve(t)
x = x * scale
y = y * scale
line.set_data(x, y)
fill.set_xy(np.column_stack([x, y]))
return line, fill
ani = FuncAnimation(fig, update, frames=30,
init_func=init, blit=True, interval=100)
plt.show()
4.3 导出为GIF或视频
为了让妈妈能在手机上查看,我们需要将动画保存为文件:
# 保存为GIF需要安装pillow
ani.save('heart_animation.gif', writer='pillow', fps=15)
# 或者保存为MP4视频
ani.save('heart_animation.mp4', writer='ffmpeg', fps=15)
5. 进阶技巧与个性化定制
基础功能完成后,我们可以进一步个性化贺卡,让它更加独特。
5.1 添加背景图片
在爱心下方添加家庭照片或妈妈喜欢的图案:
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
def add_background(ax, image_path):
img = plt.imread(image_path)
imagebox = OffsetImage(img, zoom=0.3)
ab = AnnotationBbox(imagebox, (0, 0), frameon=False)
ax.add_artist(ab)
return ax
fig, ax = plt.subplots(figsize=(8, 8))
add_background(ax, 'family_photo.jpg')
# 然后绘制爱心...
5.2 创建多个爱心组合
通过循环创建多个大小、位置不同的爱心,营造浪漫氛围:
def multiple_hearts():
positions = [(0, 0), (-100, 100), (100, 100), (100, -100), (-100, -100)]
sizes = [100, 60, 60, 40, 40]
colors = ['red', 'pink', 'hot pink', 'light pink', 'purple']
for pos, size, color in zip(positions, sizes, colors):
pen.penup()
pen.goto(pos)
pen.pendown()
draw_heart(size, color)
5.3 添加交互功能
让妈妈可以通过点击与贺卡互动:
def on_click(x, y):
pen.penup()
pen.goto(x, y)
pen.pendown()
draw_heart(30, 'red')
screen = turtle.Screen()
screen.onclick(on_click)
5.4 使用中文艺术字
如果需要更艺术的中文字体,可以指定系统字体或使用PIL加载自定义字体:
from PIL import ImageFont, ImageDraw, Image
def create_text_image():
image = Image.new('RGB', (400, 200), color='white')
draw = ImageDraw.Draw(image)
try:
font = ImageFont.truetype("STXINGKA.TTF", 48) # 华文行楷
except:
font = ImageFont.load_default()
draw.text((50, 50), "亲爱的妈妈", fill="purple", font=font)
image.save('text.png')
6. 项目打包与分享
完成贺卡制作后,我们需要考虑如何将它分享给妈妈。
6.1 将turtle作品保存为图片
turtle绘图可以直接保存为EPS或PNG格式:
canvas = turtle.getcanvas()
canvas.postscript(file="heart_card.eps", colormode='color')
# 然后可以使用PIL转换为其他格式
6.2 创建可执行文件
使用PyInstaller将Python脚本打包成exe,方便没有Python环境的妈妈直接打开:
pip install pyinstaller
pyinstaller --onefile --windowed heart_card.py
6.3 部署为网页应用
使用PyScript或Flask将作品变成网页,妈妈只需点击链接就能查看:
from flask import Flask, send_file
app = Flask(__name__)
@app.route('/')
def show_card():
return send_file('heart_animation.gif', mimetype='image/gif')
if __name__ == '__main__':
app.run()
6.4 发送到手机的最佳方式
考虑到妈妈可能使用手机,推荐这些分享方式:
- 微信传输 :将GIF或视频通过微信发送
- 邮件附件 :如果是高质量视频,可以通过邮件发送
- 云盘链接 :对于大文件,生成分享链接
- 二维码 :将网页版贺卡生成二维码,妈妈扫码即可查看
更多推荐



所有评论(0)