导语
大家好,今天我们将一起探索Python的Tkinter库,用它来绘制一个充满浪漫氛围的动态粒子爱心。想象一下,随着粒子的不断生成和移动,一个由粒子组成的爱心逐渐在屏幕上浮现,是不是非常有趣且充满创意呢
效果展示
开发过程
📚前置知识
首先,确保你的电脑上已经安装了Python,如果没有安装,你可以从官网下载并安装或查看我的另一篇文章:Python安装教程(2024最新)_python下载安装教程-CSDN博客
📚为什么使用Tkinter
Tkinter是Python的标准GUI库之一,它提供了一个强大的框架来开发图形用户界面。虽然它通常用于构建窗口、按钮、文本框等常见的界面元素,但我们也可以利用它来实现一些有趣的图形动画效果。
💻绘制的步骤
在开始编写代码之前,我们需要先确定如何绘制爱心形状。这里我们可以使用一个简单的数学公式来描述爱心的边界,但为了方便起见,我们将直接绘制一个近似于爱心的多边形。
💻动态粒子系统
接下来,我们将实现一个动态粒子系统。在这个系统中,每个粒子都有一个初始位置、速度和方向。粒子将沿着随机方向移动,并在碰到爱心边界时反弹。
-
初始化粒子:在屏幕上随机生成一定数量的粒子,并设置它们的初始位置和速度。
-
更新粒子位置:在每个时间步长中,根据粒子的速度更新它们的位置。如果粒子碰到了爱心边界,就改变它的移动方向。
-
绘制粒子:使用Tkinter的图形绘制功能来绘制每个粒子。我们可以使用圆形或方形来表示粒子,并根据需要调整它们的大小和颜色。
-
动画效果:通过不断更新和重绘粒子来实现动画效果。我们可以设置一个定时器来定期触发粒子位置的更新和重绘操作
💻运行代码
将下面完整代码复制到一个.py
文件中,然后在Python环境中运行,你会看到一个窗口,窗口显示动态粒子爱心形状。
部分代码展示
import random
from math import sin, cos, pi, log
from tkinter import *
CANVAS_WIDTH = 640
CANVAS_HEIGHT = 480
CANVAS_CENTER_X = CANVAS_WIDTH / 2
CANVAS_CENTER_Y = CANVAS_HEIGHT / 2
IMAGE_ENLARGE = 11
HEART_COLOR = "#FF99CC"
def center_window(root, width, height):
screenwidth = root.winfo_screenwidth() # 获取显示屏宽度
screenheight = root.winfo_screenheight() # 获取显示屏高度
size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) /
2, (screenheight - height) / 2) # 设置窗口居中参数
root.geometry(size) # 让窗口居中显示
def heart_function(t, shrink_ratio: float = IMAGE_ENLARGE):
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 += CANVAS_CENTER_X
y += CANVAS_CENTER_Y
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 - CANVAS_CENTER_X)
dy = ratio_y * (y - CANVAS_CENTER_Y)
return x - dx, y - dy
def shrink(x, y, ratio):
force = -1 / (((x - CANVAS_CENTER_X) ** 2 +
(y - CANVAS_CENTER_Y) ** 2) ** 0.6)
dx = ratio * force * (x - CANVAS_CENTER_X)
dy = ratio * force * (y - CANVAS_CENTER_Y)
return x - dx, y - dy
def curve(p):
return 2 * (2 * sin(4 * p)) / (2 * pi)
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))
(完整代码内容可在文末get)
注意:上述代码中的部分变量如果有必要,可以自己修改。同时,反弹逻辑的实现也需要根据具体的爱心边界来调整。
总结
通过今天的教程,我们学习了如何使用Python的Tkinter库来绘制动态粒子爱心。虽然这只是一个简单的示例,但它展示了Tkinter库在图形动画方面的强大功能。希望这个教程能激发你对Python编程的兴趣,并为你带来更多的创意和乐趣!
最后
这里分享给大家一套免费的学习资料,包含视频、源码/电子书,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以加我微信一起来学习交流。
① Python所有方向的学习路线图,清楚各个方向要学什么东西
②Python、PyCharm学习工具包全家桶,环境配置教程视频
③Python全套电子书籍PDF,全部都是干货知识
④ 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
⑤ 100多个Python实战案例,学习不再是只会理论
全套Python学习资料分享:
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频全套
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
希望这些内容对大家有所帮助,因为你我都是热爱python的编程语言爱好者。