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()
这段代码实现的方法步骤可以分为以下几个关键部分:
-
引入库和设置参数 :首先引入Tkinter库和其他必要的库,设置了画布的宽度、高度以及爱心的颜色等参数。
-
爱心类的定义 :定义了一个名为
Heart
的类,该类包含了爱心的生成、计算和渲染等功能。 -
爱心生成 :在
Heart
类中定义了build
方法,用于生成原始爱心的坐标集合,并对爱心边缘和中心进行扩散效果的处理。 -
爱心计算 :通过
calc_position
方法计算每个爱心点的新坐标,实现了爱心的动态效果。 -
爱心渲染 :在
render
方法中,将计算得到的爱心点渲染到指定的画布上。 -
其他辅助函数 :定义了一些辅助函数,如
heart_function
用于计算爱心的数学函数,scatter_inside
用于在爱心内部随机生成点,shrink
用于爱心的收缩效果,以及curve
用于产生圆滑的周期缩放比例。 -
界面和事件处理 :定义了界面和事件处理的部分,包括在窗口中显示文字和按钮,并绑定了按钮点击事件。
-
主程序入口 :在
__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%免费
】
![](https://i-blog.csdnimg.cn/blog_migrate/ce2e3ee333e711cecf756589e6b93ef1.jpeg)