Python制作跳动的爱心代码,已打包成exe,可直接运行

1、让Python语言来为你的爱情加点料!让我来为你揭秘它的魔法吧!

首先,它倚仗的是Python中强大的Tkinter库,作为画面的主窗口。它在画布上勾勒出了一个惊艳的动态

这个程序的设计真是独具匠心!它首先给你一个抉择,让你决定是否愿意做某人的女朋友。然后,如果你选择了“好哦”,它会在画面上展现一个华丽的动态爱心

而这段代码的神奇之处在于它的绘图过程。它通过数学函数和随机算法,用一种又一种巧妙的手法,勾勒出爱心的轮廓和动态效果。

2、完整源码

import tkinter as tk  
import tkinter.messagebox  
import random  
from math import sin, cos, pi, log  
from tkinter.constants import \*  
  
\# 设置画布的宽度和高度  
width = 888  
height = 500  
  
\# 爱心中心的坐标  
heartx = width / 2  
hearty = height / 2  
  
\# 爱心的大小  
side = 11  
  
\# 爱心颜色,可修改  
heartcolor = "pink"  
  
  
class Heart:  
    def \_\_init\_\_(self, generate\_frame=20):  
        \# 原始爱心坐标集合  
        self.\_points = set()  
  
        \# 边缘扩散效果点坐标集合  
        self.\_edge\_diffusion\_points = set()  
  
        \# 中心扩散效果点坐标集合  
        self.\_center\_diffusion\_points = set()  
  
        \# 每帧动态点坐标  
        self.all\_points = {}  
  
        \# 创建爱心坐标集合  
        self.build(2000)  
  
        \# 设置随机光晕大小  
        self.random\_halo = 1000  
        self.generate\_frame = generate\_frame  
  
        \# 计算每一帧的爱心坐标  
        for frame in range(generate\_frame):  
            self.calc(frame)  
  
    def build(self, number):  
        \# 生成原始爱心坐标  
        for \_ in range(number):  
            t = random.uniform(0, 2 \* pi)  
            x, y = heart\_function(t)  
            self.\_points.add((x, y))  
  
        \# 生成边缘扩散效果点坐标  
        for \_x, \_y in list(self.\_points):  
            for \_ in range(3):  
                x, y = scatter\_inside(\_x, \_y, 0.05)  
                self.\_edge\_diffusion\_points.add((x, y))  
  
        point\_list = list(self.\_points)  
  
        \# 生成中心扩散效果点坐标  
        for \_ in range(4000):  
            x, y = random.choice(point\_list)  
            x, y = scatter\_inside(x, y, 0.17)  
            self.\_center\_diffusion\_points.add((x, y))  
  
    @staticmethod  
    def calc\_position(x, y, ratio):  
        \# 计算每个点的位置  
        force = 1 / (((x - heartx) \*\* 2 \+ (y - hearty) \*\* 2) \*\* 0.520)  
        dx = ratio \* force \* (x - heartx) + random.randint(-1, 1)  
        dy = ratio \* force \* (y - hearty) + random.randint(-1, 1)  
        return x - dx, y - dy  
  
    def calc(self, generate\_frame):  
        \# 计算每一帧的爱心坐标  
        ratio = 10 \* curve(generate\_frame / 10 \* pi)  
        halo\_radius = int(4 \+ 6 \* (1 \+ curve(generate\_frame / 10 \* pi)))  
        halo\_number = int(3000 \+ 4000 \* abs(curve(generate\_frame / 10 \* pi) \*\* 2))  
        all\_points = \[\]  
        heart\_halo\_point = set()  
  
        \# 生成光晕坐标  
        for \_ in range(halo\_number):  
            t = random.uniform(0, 2 \* pi)  
            x, y = heart\_function(t, shrink\_ratio\=11.6)  
            x, y = shrink(x, y, halo\_radius)  
            if (x, y) not in heart\_halo\_point:  
                heart\_halo\_point.add((x, y))  
                x += random.randint(-14, 14)  
                y += random.randint(-14, 14)  
                size = random.choice((1, 2, 2))  
                all\_points.append((x, y, size))  
  
        \# 计算原始爱心坐标  
        for x, y in self.\_points:  
            x, y = self.calc\_position(x, y, ratio)  
            size = random.randint(1, 3)  
            all\_points.append((x, y, size))  
  
        \# 计算边缘扩散效果点坐标  
        for x, y in self.\_edge\_diffusion\_points:  
            x, y = self.calc\_position(x, y, ratio)  
            size = random.randint(1, 2)  
            all\_points.append((x, y, size))  
  
        \# 计算中心扩散效果点坐标  
        for x, y in self.\_center\_diffusion\_points:  
            x, y = self.calc\_position(x, y, ratio)  
            size = random.randint(1, 2)  
            all\_points.append((x, y, size))  
  
        self.all\_points\[generate\_frame\] = all\_points  
  
    def render(self, render\_canvas, render\_frame):  
        \# 渲染爱心  
        for x, y, size in self.all\_points\[render\_frame % self.generate\_frame\]:  
            render\_canvas.create\_rectangle(x, y, x + size, y + size, width\=0, fill\=heartcolor)  
  
  
def heart\_function(t, shrink\_ratio: float \= side):  
    \# 爱心函数  
    x = 16 \* (sin(t) \*\* 3)  
    y = -(13 \* cos(t) - 5 \* cos(2 \* t) - 2 \* cos(3 \* t) - cos(4 \* t))  
    x \*= shrink\_ratio  
    y \*= shrink\_ratio  
    x += heartx  
    y += hearty  
    return int(x), int(y)  
  
  
def scatter\_inside(x, y, beta=0.15):  
    \# 计算内部扩散坐标  
    ratio\_x = - beta \* log(random.random())  
    ratio\_y = - beta \* log(random.random())  
    dx = ratio\_x \* (x - heartx)  
    dy = ratio\_y \* (y - hearty)  
    return x - dx, y - dy  
  
  
def shrink(x, y, ratio):  
    \# 收缩爱心  
    force = -1 / (((x - heartx) \*\* 2 \+ (y - hearty) \*\* 2) \*\* 0.6)  
    dx = ratio \* force \* (x - heartx)  
    dy = ratio \* force \* (y - hearty)  
    return x - dx, y - dy  
  
  
def curve(p):  
    \# 计算曲线  
    return 2 \* (2 \* sin(4 \* p)) / (2 \* pi)  
  
  
def draw(main: tk.Tk, render\_canvas: tk.Canvas, render\_heart: Heart, render\_frame=0):  
    \# 绘制爱心  
    render\_canvas.delete('all')  
    render\_heart.render(render\_canvas, render\_frame)  
    main.after(160, draw, main, render\_canvas, render\_heart, render\_frame + 1)  
  
  
def love():  
    \# 创建窗口  
    root = tk.Tk()  
    screenwidth = root.winfo\_screenwidth()  
    screenheight = root.winfo\_screenheight()  
    x = (screenwidth - width) // 2  
    y = (screenheight - height) // 2 \- 66  
    root.geometry("%dx%d+%d+%d" % (width, height, x, y))  
    root.title("❤")  
    canvas = tk.Canvas(root, bg\='black', height\=height, width\=width)  
    canvas.pack()  
    heart = Heart()  
    draw(root, canvas, heart)  
    tk.Label(root, text\="I Love You!", bg\="black", fg\="#FF99CC", font\="Helvetic 25 bold").place(relx\=.5, rely\=.5,  
                                                                                                anchor\=CENTER)  
    root.mainloop()  
  
  
if \_\_name\_\_ == '\_\_main\_\_':  
    \# 创建主窗口  
    root = tk.Tk()  
    root.title('嘻嘻')  
    root.resizable(0, 0)  
    root.wm\_attributes("-toolwindow", 1)  
    screenwidth = root.winfo\_screenwidth()  
    screenheight = root.winfo\_screenheight()  
    widths = 300  
    heights = 100  
    x = (screenwidth - widths) / 2  
    y = (screenheight - heights) / 2 \- 66  
    root.geometry('%dx%d+%d+%d' % (widths, heights, x, y))  \# 设置在屏幕中居中显示  
  
    \# 创建标签和按钮  
    tk.Label(root, text\='亲爱的,做我女朋友好吗?', width\=37, font\=('宋体', 12)).place(x\=0, y\=10)  
  
  
    def OK():  \# 同意按钮  
        root.destroy()  
        love()  \# 同意后显示动态爱心  
  
  
    def NO():  \# 拒绝按钮,拒绝不会退出,必须同意才可以退出哦~  
        tk.messagebox.showwarning('❤', '再给你一次机会!')  
  
  
    def closeWindow():  
        tk.messagebox.showwarning('❤', '逃避是没有用的哦')  
  
  
    tk.Button(root, text\='好哦', width\=5, height\=1, command\=OK).place(x\=80, y\=50)  
    tk.Button(root, text\='不要', width\=5, height\=1, command\=NO).place(x\=160, y\=50)  
    root.protocol('WM\_DELETE\_WINDOW', closeWindow)  \# 绑定退出事件  
    root.mainloop()  

这段代码实现的方法步骤可以分为以下几个关键部分:

  1. 引入库和设置参数 :首先引入Tkinter库和其他必要的库,设置了画布的宽度、高度以及爱心的颜色等参数。

  2. 爱心类的定义 :定义了一个名为 Heart的类,该类包含了爱心的生成、计算和渲染等功能。

  3. 爱心生成 :在 Heart类中定义了build方法,用于生成原始爱心的坐标集合,并对爱心边缘和中心进行扩散效果的处理。

  4. 爱心计算 :通过 calc_position方法计算每个爱心点的新坐标,实现了爱心的动态效果。

  5. 爱心渲染 :在 render方法中,将计算得到的爱心点渲染到指定的画布上。

  6. 其他辅助函数 :定义了一些辅助函数,如 heart_function用于计算爱心的数学函数, scatter_inside用于在爱心内部随机生成点, shrink用于爱心的收缩效果,以及 curve用于产生圆滑的周期缩放比例。

  7. 界面和事件处理 :定义了界面和事件处理的部分,包括在窗口中显示文字和按钮,并绑定了按钮点击事件。

  8. 主程序入口 :在 __main__中实例化了Tkinter窗口,并设置了界面参数和布局,以及绑定了关闭窗口的事件处理。

获取打包好的exe程序:可以免python环境,直接运行

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值