Python跳动的爱心
系列文章
序号 | 直达链接 |
---|---|
Tkinter | |
1 | Python李峋同款可写字版跳动的爱心 |
2 | Python跳动的双爱心 |
3 | Python蓝色跳动的爱心 |
4 | Python动漫烟花 |
5 | Python粒子烟花 |
Turtle | |
1 | Python满屏飘字 |
2 | Python蓝色流星雨 |
3 | Python金色流星雨 |
4 | Python漂浮爱心 |
5 | Python爱心光波① |
6 | Python爱心光波② |
7 | Python满天繁星 |
8 | Python五彩气球 |
9 | Python白色飘雪 |
10 | Python七彩花朵 |
11 | Python 3D星空 |
12 | Python大雪纷飞 |
13 | Python一闪一闪亮星星 |
14 | Python爱心泡泡 |
15 | Python爱心射线 |
16 | Python圣诞礼物 |
17 | Python礼物圣诞树 |
18 | Python浪漫星空 |
19 | Python飞舞蝙蝠 |
20 | Python万圣礼物 |
21 | Python蓝色飘雪 |
Pygame | |
1 | Python跨年烟花 |
2 | Python炫酷烟花 |
3 | Python黑客帝国字母雨 |
敬请期待…… |
写在前面
Python语言实现蓝色跳动的爱心的完整代码。
技术需求
-
Tkinter库:用于创建图形用户界面(GUI)应用程序。
tkinter
是Python内置的库,用于构建窗口、画布和交互组件。在这个代码中,Tk
类用于创建主窗口,Canvas
类用于绘制图形。 -
数学函数和坐标计算:
- 爱心形状的计算:通过数学公式绘制爱心的形状。使用了
sin
和cos
函数来计算爱心的坐标,并根据参数shrink_ratio
来缩放图形的大小。 - 随机扩散和散点效果:使用了对数函数和随机数生成技术(例如
random.uniform
和random.choice
)来模拟爱心的边缘扩散和中心扩散效果,使得爱心在每帧渲染时看起来更加动态和生动。 - 力学模拟:通过力学模型计算坐标的变化,以模拟爱心的扩散和收缩效果。
- 爱心形状的计算:通过数学公式绘制爱心的形状。使用了
-
图形绘制:
- 点的动态变化:每一帧渲染时,通过更新爱心的坐标,创建一种动态效果,使得爱心不断变化,产生扩散和收缩的效果。
- 创建矩形:在
render
方法中,使用create_rectangle
方法在画布上绘制矩形,表示爱心的每个点。矩形的大小和位置随着每帧的计算不断变化。
-
动画效果:通过
main.after()
方法,每隔160毫秒更新一次帧,从而实现平滑的动画效果。after
方法用于定时调用draw
函数,不断地渲染新的一帧,达到动画的效果。 -
界面布局:
- 屏幕居中:通过
winfo_screenwidth()
和winfo_screenheight()
方法获取屏幕的宽度和高度,再计算窗口的起始位置,使得窗口在屏幕中央显示。 - 文字显示:使用
Label
组件在画布上显示文字,并且通过place
方法将其定位在窗口的中央。
- 屏幕居中:通过
完整代码
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 = "skyblue" # 爱心颜色,可修改
word = "I Love You!" # 想要写的字,可修改
# 爱心类
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)
……
代码分析
这段代码使用了 tkinter
库来创建一个动态的爱心图案,并在屏幕上显示带有动态效果的“我爱你”字样,以下是对这段代码的详细分析。
1. 导入所需的库
tkinter
用于创建图形用户界面(GUI)。random
用于生成随机数,主要用于控制爱心图案的扩散效果。math
中的sin
,cos
,pi
,log
用于数学计算,生成爱心形状和扩散效果。tkinter.constants
包含了CENTER
等常量,用于控制控件的对齐方式。
2. 全局变量定义
width
,height
: 定义画布的大小。heartx
,hearty
: 爱心的中心坐标。side
: 用于定义爱心形状的缩放比例。heartcolor
: 爱心的颜色。word
: 要显示的文本内容。
3. Heart 类的定义
Heart
类是主要的核心,用来生成和管理爱心的坐标点,并计算每一帧的动态效果。
- 在
__init__
方法中,build()
方法生成初始的爱心形状的坐标点,calc()
方法计算每一帧的动态效果,generate_frame
控制总的帧数。 self._points
:存储生成的爱心图案的原始点。self._edge_diffusion_points
:存储边缘扩散的点。self._center_diffusion_points
:存储中心扩散的点。self.all_points
:存储每一帧的所有点,用于动态渲染。
4. build() 方法
build
方法用于生成一定数量的爱心坐标点。通过随机选择角度t
,使用heart_function(t)
计算出坐标(x, y)
,并将其加入_points
集合中。
5. scatter_inside() 和 shrink() 方法
scatter_inside(x, y)
:用于生成坐标点的散布效果,模拟点在爱心内部随机扩散的效果。
shrink(x, y)
:用于将坐标点向爱心的中心收缩,模拟爱心的聚焦效果。
6. calc_position() 方法
calc_position(x, y, ratio)
:根据每一帧的动画计算坐标点的位移,使用一个参数ratio
来控制动画的流畅度。
7. calc() 方法
calc()
方法用于生成每一帧的动态坐标,包含了爱心外部的扩散效果、边缘扩散、中心扩散等效果。通过random.uniform()
随机生成颜色变化和点的位置。
8. render() 方法
render()
方法根据当前帧数render_frame
渲染出每一帧的爱心图案。通过create_rectangle()
在画布上绘制一个小矩形来表示每个动态点。
9. heart_function() 方法
heart_function(t)
:生成爱心形状的基本坐标,通过参数t
控制点的分布,并根据shrink_ratio
来调整爱心的大小。
10. curve() 方法
curve(p)
:生成一个周期性的曲线函数,用于控制动态效果的平滑度。
11. draw() 方法
draw()
:这是一个递归的函数,每隔 160 毫秒调用一次,用来更新动画的每一帧。
12. love() 主函数
love()
:这是程序的入口函数。它初始化了Tkinter
窗口,设置了窗口的位置和大小,创建了一个画布(Canvas
),然后创建了Heart
对象,并启动了draw()
函数进行动画渲染。
这段代码使用了 tkinter
创建一个动画效果,绘制了一个动态的爱心图案,并在其上显示“我爱你”字样。代码的核心部分是 Heart
类,它负责生成和计算爱心的形状和每一帧的动态效果。通过随机散布、扩散、收缩等效果,使得爱心看起来富有动态感和生命力。
写在后面
我是一只有趣的兔子,感谢你的喜欢。