Python实现爱心弹窗的完整教学(附源码)

 更新时间:2026年04月02日 08:41:49   作者:鸽芷咕  
这篇文章主要为大家详细介绍了Python实现爱心弹窗的特效,一段不到 40 行的 Python 代码,在屏幕上依次绽放出爱心形状的弹窗,每一条都是你想对 TA 说的话,有需要的小伙伴可以了解下

一段不到 40 行的 Python 代码,在屏幕上依次绽放出爱心形状的弹窗,每一条都是你想对 TA 说的话。

效果预览

程序运行后会出现三个阶段:

  • 爱心绽放 — 100 个小弹窗沿心形曲线依次弹出,每 0.03 秒一个,最终拼成一顆完整的爱心。
  • 满屏暴击 — 爱心消失后,弹窗铺满整个屏幕,每个窗口都是一句暖心的叮嘱。
  • 温柔收场 — 等待 10 秒后,所有弹窗在 1 秒内优雅地逐个关闭。

按下 空格键 可以随时退出。

核心原理

1. 心形曲线公式

爱心形状来自经典的参数方程

  • x=16sin3(t)
  • y=13cos(t)5cos(2t)2cos(3t)cos(4t)

将参数 t 从 0 到 2π 均匀取 100 个点,就能得到一个平滑的心形轮廓。然后将其缩放并居中到屏幕中央。

def heart_points(n, screen_w, screen_h):
    points = []
    for i in range(n):
        t = i / n * 2 * math.pi
        x = 16 * math.sin(t) ** 3
        y = 13 * math.cos(t) - 5 * math.cos(2*t) - 2 * math.cos(3*t) - math.cos(4*t)
        sx = int(screen_w/2 + x*20 - 50)   # 缩放 20 倍并居中
        sy = int(screen_h/2 - y*20 - 80)
        points.append((sx, sy))
    return points

2. 弹窗窗口

每个弹窗本质上是一个 tk.Toplevel 小窗口:

def create_window(x, y, tip=None):
    win = tk.Toplevel()
    win.geometry(f"150x60+{x}+{y}")
    win.title("提示")
    win.attributes('-topmost', 1)          # 始终置顶
    text = tip or random.choice(tips)      # 随机选取一句暖心话
    color = random.choice(colors)          # 随机背景色
    tk.Label(win, text=text, bg=color,
             font=("微软雅黑", 14), width=20, height=3).pack()
    return win
  • -topmost:确保弹窗始终在最前方。
  • 随机文案:每次从预设列表中随机抽取一条温馨提醒。
  • 随机配色:粉色、浅蓝、浅绿等柔和色调,视觉上温馨可爱。

3. 三阶段动画流程

# 阶段一:爱心绽放
for x, y in heart_points(100, sw, sh):
    win = create_window(x, y)
    hearts.append(win)
    root.update()
    time.sleep(0.03)

time.sleep(1)
# 销毁爱心弹窗

# 阶段二:满屏暴击
for _ in range(sw//150 * sh//40 + 50):
    x = random.randint(0, sw-150)
    y = random.randint(0, sh-60)
    win = create_window(x, y)
    all_windows.append(win)
    root.update()
    time.sleep(0.005)

time.sleep(10)

# 阶段三:优雅关闭
interval = 1.0 / len(all_windows)
for win in all_windows:
    win.destroy()
    root.update()
    time.sleep(interval)

完整代码(可读版)

import tkinter as tk, random, time, sys, math

hearts, all_wins = [], []
tips = ["多喝水利", "好好爱自己", "好好吃饭", "保持好心情",
        "我想你了", "顺顺利利", "别熬夜", "天凉了多穿衣服"]
colors = ["pink", "lightblue", "lightgreen", "lemonchiffon",
          "hotpink", "skyblue"]


def heart_points(n, screen_w, screen_h):
    """生成心形曲线上的 n 个屏幕坐标点"""
    points = []
    for i in range(n):
        t = i / n * 2 * math.pi
        x = 16 * math.sin(t) ** 3
        y = (13 * math.cos(t) - 5 * math.cos(2*t)
             - 2 * math.cos(3*t) - math.cos(4*t))
        sx = int(screen_w / 2 + x * 20 - 50)
        sy = int(screen_h / 2 - y * 20 - 80)
        sx = max(0, min(sx, screen_w - 150))
        sy = max(0, min(sy, screen_h - 60))
        points.append((sx, sy))
    return points


def create_popup(x, y, tip=None):
    """在指定位置创建一个弹窗"""
    win = tk.Toplevel()
    win.geometry(f"150x60+{x}+{y}")
    win.title("提示")
    win.attributes('-topmost', 1)
    text = tip or random.choice(tips)
    bg = random.choice(colors)
    tk.Label(win, text=text, bg=bg,
             font=("微软雅黑", 14), width=20, height=3).pack()
    win.bind('<space>',
             lambda e: [w.destroy() for w in hearts + all_wins] or sys.exit())
    return win


def main():
    root = tk.Tk()
    root.withdraw()
    sw = root.winfo_screenwidth()
    sh = root.winfo_screenheight()

    # ---- 阶段一:爱心绽放 ----
    points = heart_points(100, sw, sh)
    for i, (x, y) in enumerate(points):
        tip = "充实自己" if i == len(points) - 1 else None
        win = create_popup(x, y, tip)
        hearts.append(win)
        root.update()
        time.sleep(0.03)

    time.sleep(1)
    for w in hearts:
        if isinstance(w, tk.Toplevel) and w.winfo_exists():
            w.destroy()

    # ---- 阶段二:满屏暴击 ----
    count = sw // 150 * sh // 40 + 50
    for _ in range(count):
        x = random.randint(0, sw - 150)
        y = random.randint(0, sh - 60)
        win = create_popup(x, y)
        all_wins.append(win)
        root.update()
        time.sleep(0.005)

    time.sleep(10)

    # ---- 阶段三:优雅关闭 ----
    interval = 1.0 / len(all_wins) if all_wins else 0
    for win in all_wins:
        if isinstance(win, tk.Toplevel) and win.winfo_exists():
            win.destroy()
        root.update()
        time.sleep(interval)

    root.mainloop()


if __name__ == "__main__":
    main()

自定义指南

修改文案

编辑 tips 列表即可替换弹窗中显示的文字:

tips = ["自定义文案1", "自定义文案2", "..."]

修改配色

编辑 colors 列表,支持所有 Tkinter 认可的颜色名或十六进制值:

colors = ["#FFB6C1", "#87CEEB", "#DDA0DD", "#98FB98"]

调整爱心大小

修改 heart_points 函数中 x * 20y * 20 的缩放倍数,数字越大爱心越大。

调整弹窗数量

  • 爱心弹窗数:修改 heart_points(100, ...) 中的 100
  • 满屏弹窗数:修改 sw // 150 * sh // 40 + 50 中的公式

运行方式

确保已安装 Python 3(自带 tkinter),直接运行:

python 爱心弹窗.py

仅依赖 Python 标准库,无需安装任何第三方包。

小结

这个小程序用到的知识点:

知识点说明
tkinterPython 标准 GUI 库
心形参数方程数学之美
time.sleep + update()手动实现逐帧动画
random.choice随机选取文案和颜色
-topmost 属性窗口始终置顶

不到 40 行代码,就能给 TA 一个小小的惊喜。快去试试吧!

以上就是Python实现爱心弹窗的完整教学(附源码)的详细内容,更多关于Python爱心弹窗的资料请关注脚本之家其它相关文章!

相关文章

  • 一文解决django 2.2与mysql兼容性问题

    一文解决django 2.2与mysql兼容性问题

    Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。这篇文章主要介绍了解决django 2.2与mysql兼容性问题,需要的朋友可以参考下
    2020-07-07
  • Python 冷门魔术方法小结

    Python 冷门魔术方法小结

    本文主要介绍了Python 冷门魔术方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • python脚本打包后无法运行exe文件的解决方案

    python脚本打包后无法运行exe文件的解决方案

    这篇文章主要介绍了python脚本打包后无法运行exe文件的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python中dilb和face_recognition第三方包安装失败的解决

    Python中dilb和face_recognition第三方包安装失败的解决

    本文主要介绍了Python中dilb和face_recognition第三方包安装失败的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python贪吃蛇核心功能实现下

    python贪吃蛇核心功能实现下

    我想大家都玩过诺基亚上面的贪吃蛇吧,这篇文章将带你一步步用python语言实现一个snake小游戏,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-09-09
  • 从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)

    从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)

    这篇文章主要介绍了从零开始的TensorFlow+VScode开发环境搭建的步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • python下MySQLdb用法实例分析

    python下MySQLdb用法实例分析

    这篇文章主要介绍了python下MySQLdb用法,实例分析了Python中MySQLdb的安装及使用技巧,包括增删改查及乱码处理的相关技巧,需要的朋友可以参考下
    2015-06-06
  • Python比较两个日期的两种方法详解

    Python比较两个日期的两种方法详解

    我们使用Python处理日期/时间的时候,经常会遇到各种各样的问题。本文为大家总结了两个Python比较两个日期的方法,需要的可以参考一下
    2022-07-07
  • Python引用传值概念与用法实例小结

    Python引用传值概念与用法实例小结

    这篇文章主要介绍了Python引用传值概念与用法,简单分析了Python引用传值的概念、功能并结合实例形式总结分析了Python引用传值的具体实现与使用方法,需要的朋友可以参考下
    2017-10-10
  • 深入理解python协程

    深入理解python协程

    协程又称为微线程,协程是一种用户态的轻量级线程,它是实现多任务的另一种方式,只不过是比线程更小的执行单元。因为它自带CPU的上下文,这样只要在合适的时机,我们可以把一个协程切换到另一个协程
    2021-06-06

最新评论