熬夜捣鼓了三晚,我把Python爱心代码玩出了这些新花样
上周帮同事想情人节惊喜,他说“送花太俗,发红包没新意”,突然想起去年用Python画爱心哄女朋友的经历——屏幕上跳动的粉色爱心,比实体店299的玫瑰多了点“理工男的浪漫”。这两天整理了之前写的代码,又加了几个自认为“更戳人”的创意,索性写下来分享。
先从最基础的开始:用数学公式画颗“标准爱心”
很多人学Python图形化编程时,第一个练手项目就是画爱心。最经典的方法是用turtle库(虽然这里不能放外链,但提一下库名),配合心形线的数学方程。记得我第一次写的时候,对着公式捣鼓了半小时——其实原理特简单:用参数方程把爱心的轮廓算出来,再让小海龟一笔一笔画。
基础代码长这样(附逐行解释)
先上代码,再聊细节。新手直接复制到IDLE里跑,记得提前装turtle库(不过Python3默认自带):
import turtle # 导入绘图库 import math # 用于数学计算 # 设置画布大小和背景色 turtle.setup(width=800, height=600) turtle.bgcolor("#FFF0F5") # 淡粉色背景更应景 # 定义画爱心的函数 def draw_heart(size, color): turtle.color(color) turtle.begin_fill() # 开始填充颜色 angle = 0 while angle < 360: # 绕360度画轮廓 rad = math.radians(angle) # 角度转弧度 # 心形线的参数方程:r = a(1 - sinθ) x = size * (16 * (math.sin(rad))3) y = size * (13 * math.cos(rad) - 5 * math.cos(2*rad) - 2 * math.cos(3*rad) - math.cos(4*rad)) turtle.goto(x, y) # 移动到计算出的坐标 angle += 2 # 步长越小,线条越平滑 turtle.end_fill() # 结束填充 # 调用函数:画一个大小50,颜色为#FF69B4(深粉色)的爱心 turtle.penup() # 提笔,移动时不画线 turtle.goto(0, -100) # 调整爱心位置,让它居中 turtle.pendown() # 落笔,开始绘制 draw_heart(50, "#FF69B4") turtle.hideturtle() # 隐藏小海龟箭头 turtle.done() # 保持窗口不关闭
当时写这段代码时犯了个傻:一开始没调整goto(0,-100),结果爱心顶在窗口上沿,像被“截断”了一半。后来查turtle坐标系统才明白,默认原点在画布中心,得把爱心往下移一点才好看。
进阶玩法:让爱心“动”起来
静态爱心虽美,但少了点“心跳”的感觉。去年给女朋友演示时,她盯着屏幕说:“要是能像真的心脏一样‘扑通扑通’跳就好了。”于是我捣鼓出了动态版本——用循环控制爱心大小变化,配合颜色渐变,效果像极了紧张时的心跳。
动态心跳爱心:代码核心逻辑
关键是用turtle.clear()
清空画布,再循环重画不同大小的爱心。为了让变化更自然,我用了正弦函数控制缩放(sin函数的波动很像心跳节奏):
import turtle import math turtle.setup(800, 600) turtle.bgcolor("#FFF0F5") turtle.tracer(0) # 关闭自动刷新,手动控制更流畅 def heartbeat(): size = 50 + 10 * math.sin(turtle.delay()/10) # 用sin函数控制大小变化 color_r = 255 - int(20 * math.sin(turtle.delay()/10)) # 红色通道渐变 color_g = 105 - int(10 * math.sin(turtle.delay()/10)) # 绿色通道渐变 color = (color_r/255, color_g/255, 181/255) # RGB转0-1范围 turtle.clear() # 清空之前的画 turtle.penup() turtle.goto(0, -100) turtle.pendown() turtle.color(color) turtle.begin_fill() angle = 0 while angle < 360: rad = math.radians(angle) x = size * (16 * (math.sin(rad))3) y = size * (13 * math.cos(rad) - 5 * math.cos(2*rad) - 2 * math.cos(3*rad) - math.cos(4*rad)) turtle.goto(x, y) angle += 2 turtle.end_fill() turtle.update() # 手动刷新画面 turtle.ontimer(heartbeat, 50) # 每50ms调用一次,形成动画 heartbeat() turtle.hideturtle() turtle.done()
这里有个小技巧:turtle.tracer(0)
会关闭自动刷新,必须配合turtle.update()
手动刷新,否则画面会闪得厉害。第一次跑的时候没开tracer,爱心像在“抖屏”,差点以为代码写崩了。
更戳人的细节:加入“专属文字”和交互
同事看了动态爱心后问:“能不能把女朋友名字加进去?”这简单,turtle库的turtle.write()
方法就能写文字。但要注意字体和位置——比如把名字放在爱心中间,用艺术字更浪漫。
带专属文字的爱心:代码怎么改?
在画完爱心后,用turtle.write()
添加文字。记得调整笔的颜色和字体大小,别让字被爱心盖住:
# 在draw_heart函数后添加文字代码 turtle.penup() turtle.goto(0, 30) # 文字位置在爱心上方 turtle.pencolor("#8B008B") # 紫色更显眼 turtle.write("Loving You", align="center", font=("Comic Sans MS", 24, "bold"))
如果想更有交互性,还能用input()
让用户输入名字。比如运行代码时弹出对话框:“输入你想表白的人:”,然后把输入的内容写到爱心上。我试过给女朋友用,她看到自己名字出现在跳动的爱心中间,真的笑出了声。
避坑指南:新手常见问题
教过几个朋友写爱心代码,发现大家容易卡在这几个地方,整理出来避坑:
- 运行后窗口闪退:可能是没加
turtle.done()
,或者用了某些IDE(比如VS Code)需要手动保持窗口。解决办法:在代码最后加turtle.exitonclick()
,点击窗口才会关闭。 - 爱心变形或颜色不对:检查数学公式是否写错(比如把sin写成cos),或者RGB颜色值超出0-255范围(动态版本里要注意取整)。
- 画面卡顿:如果用了循环重画,可能是步长(angle += 2)太小,导致计算量太大。可以调大步长(比如angle += 5),牺牲一点平滑度换流畅度。
写在最后:代码之外的浪漫
其实这些代码本身并不复杂,真正打动人的是“为了一个人去学新东西”的心意。去年女朋友看到我熬夜调颜色参数,黑眼圈重得像熊猫,反而觉得比爱心本身更珍贵。现在她偶尔还会翻出那个代码说:“再跑一次吧,看这颗心还跳不跳。”
对了,如果你也想试试,记得提前检查Python环境——要是运行时报错“找不到turtle”,可能是装的是精简版Python,用pip install turtle
装一下就行(不过大多数情况不需要)。最后,希望你的爱心代码,能比屏幕更温暖。