用Python给朋友一个惊喜:自动化生成个性化生日贺卡(附完整源码)

发布时间:2026/6/2 1:40:23

用Python给朋友一个惊喜:自动化生成个性化生日贺卡(附完整源码) 用Python打造暖心生日惊喜从绘图到自动发送的完整指南生日贺卡早已不再是简单的纸质问候在这个数字化时代用代码亲手为朋友定制一张动态贺卡或许是最特别的祝福方式。想象一下当朋友在生日当天收到一封自动发送的邮件打开附件发现是一张由你编写的程序生成的个性化贺卡上面不仅有精美的蛋糕动画还有专属的祝福语——这种惊喜感是普通礼物难以比拟的。1. 环境准备与基础绘图在开始我们的创意编程之旅前需要确保开发环境就绪。推荐使用Python 3.6版本并安装必要的图形库pip install turtle pillowTurtle是Python内置的绘图模块非常适合初学者创建2D图形。我们先从一个简单的蛋糕轮廓开始import turtle as t def setup_canvas(): t.bgcolor(#F5F5F5) # 浅灰色背景 t.setup(800, 600) # 设置画布大小 t.speed(10) # 中等绘制速度 def draw_plate(): t.penup() t.goto(-150, -100) t.pendown() t.color(#E0E0E0, #FFFFFF) t.begin_fill() t.circle(150, 180) # 绘制半圆作为盘子 t.end_fill() setup_canvas() draw_plate() t.done()这段代码会创建一个简单的蛋糕底盘运行后你将看到浅灰色背景的绘图窗口底部有一个白色半圆形盘子绘图完成后窗口保持打开状态提示在交互式环境中运行代码时可能需要手动关闭图形窗口才能继续执行后续代码2. 构建多层蛋糕结构真实的生日蛋糕通常是多层的我们可以用函数封装每层的绘制逻辑def cake_layer(x, y, width, height, color): t.penup() t.goto(x, y) t.pendown() t.color(color) t.begin_fill() for _ in range(2): # 绘制矩形 t.forward(width) t.left(90) t.forward(height) t.left(90) t.end_fill() # 顶部装饰线 t.penup() t.goto(x, yheight) t.pendown() t.pensize(3) t.forward(width) t.pensize(1)现在可以组合多个蛋糕层setup_canvas() draw_plate() # 底层蛋糕 cake_layer(-120, -80, 240, 60, #FFD3B6) # 浅橙色 # 中层蛋糕 cake_layer(-90, -20, 180, 50, #FFAAA5) # 粉红色 # 顶层蛋糕 cake_layer(-60, 30, 120, 40, #A8E6CF) # 薄荷绿 t.done()各层参数对比层级宽度高度Y坐标颜色代码视觉效果底层24060-80#FFD3B6宽大稳固中层18050-20#FFAAA5过渡衔接顶层1204030#A8E6CF精致小巧3. 添加动态元素与个性化文本静态图像已经足够漂亮但加入动态元素会让贺卡更加生动。我们可以添加闪烁的蜡烛火焰import random import time def flickering_flame(x, y): for _ in range(5): # 火焰闪烁效果 t.penup() t.goto(x, y) t.pendown() flame_color random.choice([#FFD700, #FF6347, #FFA500]) t.color(flame_color) t.begin_fill() t.circle(10) # 火焰基础形状 t.end_fill() time.sleep(0.3) t.clear() # 清除当前火焰准备绘制下一个个性化文本添加也很关键我们可以让用户输入祝福语def personalized_message(name): t.penup() t.goto(-200, 200) t.pendown() t.color(#8B00FF) message fHappy Birthday, {name}! t.write(message, font(Arial, 24, bold))组合所有元素def complete_card(name): setup_canvas() draw_plate() cake_layer(-120, -80, 240, 60, #FFD3B6) cake_layer(-90, -20, 180, 50, #FFAAA5) cake_layer(-60, 30, 120, 40, #A8E6CF) # 添加蜡烛 for x_pos in [-80, -40, 0, 40, 80]: cake_layer(x_pos-5, 70, 10, 30, #FFFFFF) # 白色蜡烛 flickering_flame(x_pos, 110) # 火焰效果 personalized_message(name) t.done()4. 自动化发送与高级功能完成贺卡设计后我们可以实现自动发送功能。首先需要将绘图保存为图片from PIL import ImageGrab import datetime def save_card(name): # 获取当前日期作为文件名 date_str datetime.datetime.now().strftime(%Y%m%d) filename fbirthday_card_{name}_{date_str}.png # 截取Turtle绘图区域 img ImageGrab.grab(bbox(0, 0, 800, 600)) img.save(filename) return filename然后配置自动邮件发送import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage def send_email(to_addr, name, card_path): # 配置邮件基本信息 msg MIMEMultipart() msg[From] your_emailexample.com msg[To] to_addr msg[Subject] fSpecial Birthday Wish for {name} # 添加文本内容 body f html body pDear {name},/p pWishing you a fantastic birthday!/p pThis card was generated just for you with Python code./p img srccid:image1 width400 /body /html msg.attach(MIMEText(body, html)) # 添加图片附件 with open(card_path, rb) as f: img MIMEImage(f.read()) img.add_header(Content-ID, image1) msg.attach(img) # 发送邮件 with smtplib.SMTP(smtp.example.com, 587) as server: server.starttls() server.login(your_emailexample.com, your_password) server.send_message(msg)完整流程整合def auto_birthday_wish(name, email): # 生成贺卡 complete_card(name) # 保存图片 card_file save_card(name) # 发送邮件 send_email(email, name, card_file) print(fBirthday card sent to {name} at {email})注意在实际使用前需要配置真实的SMTP服务器信息和邮箱凭证5. 创意扩展与个性化定制基础功能实现后我们可以考虑更多个性化选项主题颜色定制允许用户选择蛋糕的主色调动画效果增强添加更多动态元素如飘落的花瓣音乐集成在打开贺卡时播放生日歌响应式设计根据接收设备调整贺卡尺寸颜色主题选择示例THEMES { classic: {base: #FFD3B6, middle: #FFAAA5, top: #A8E6CF}, chocolate: {base: #6B4423, middle: #8B4513, top: #A0522D}, berry: {base: #FFB6C1, middle: #FF69B4, top: #C71585} } def apply_theme(theme_name): return THEMES.get(theme_name, THEMES[classic])用户交互改进def get_user_input(): print(Create a Personalized Birthday Card) print(----------------------------------) name input(Recipients name: ) email input(Recipients email: ) theme input(Theme (classic/chocolate/berry): ) message input(Custom message (optional): ) return { name: name, email: email, theme: theme, message: message or None }最终的主程序逻辑def main(): user_input get_user_input() colors apply_theme(user_input[theme]) # 使用用户选择的颜色重新定义蛋糕层 def custom_cake(): cake_layer(-120, -80, 240, 60, colors[base]) cake_layer(-90, -20, 180, 50, colors[middle]) cake_layer(-60, 30, 120, 40, colors[top]) # 生成并发送贺卡 complete_card(user_input[name]) card_file save_card(user_input[name]) send_email(user_input[email], user_input[name], card_file) if __name__ __main__: main()在实际项目中我发现最让收件人惊喜的往往不是技术复杂度而是那些精心设计的个性化细节。比如在蛋糕上添加收件人名字的首字母或者根据他们的兴趣爱好添加相关元素如足球、音乐符号等。这些细节让贺卡从好看的自动生成图片变成了专属于TA的特别礼物。

相关新闻