一篇文章玩懂Python Tkinter:绘制动态粒子爱心代码

导语

大家好,今天我们将一起探索Python的Tkinter库,用它来绘制一个充满浪漫氛围的动态粒子爱心。想象一下,随着粒子的不断生成和移动,一个由粒子组成的爱心逐渐在屏幕上浮现,是不是非常有趣且充满创意呢

效果展示

开发过程

📚前置知识

首先,确保你的电脑上已经安装了Python,如果没有安装,你可以从官网下载并安装或查看我的另一篇文章:Python安装教程(2024最新)_python下载安装教程-CSDN博客

📚为什么使用Tkinter

Tkinter是Python的标准GUI库之一,它提供了一个强大的框架来开发图形用户界面。虽然它通常用于构建窗口、按钮、文本框等常见的界面元素,但我们也可以利用它来实现一些有趣的图形动画效果。

💻绘制的步骤

在开始编写代码之前,我们需要先确定如何绘制爱心形状。这里我们可以使用一个简单的数学公式来描述爱心的边界,但为了方便起见,我们将直接绘制一个近似于爱心的多边形。

💻动态粒子系统

接下来,我们将实现一个动态粒子系统。在这个系统中,每个粒子都有一个初始位置、速度和方向。粒子将沿着随机方向移动,并在碰到爱心边界时反弹。

  1. 初始化粒子:在屏幕上随机生成一定数量的粒子,并设置它们的初始位置和速度。

  2. 更新粒子位置:在每个时间步长中,根据粒子的速度更新它们的位置。如果粒子碰到了爱心边界,就改变它的移动方向。

  3. 绘制粒子:使用Tkinter的图形绘制功能来绘制每个粒子。我们可以使用圆形或方形来表示粒子,并根据需要调整它们的大小和颜色。

  4. 动画效果:通过不断更新和重绘粒子来实现动画效果。我们可以设置一个定时器来定期触发粒子位置的更新和重绘操作

💻运行代码

将下面完整代码复制到一个.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学习资料获取》 

   希望这些内容对大家有所帮助,因为你我都是热爱python的编程语言爱好者。

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴回答您的问题。以下是一个使用Python实现的3D粒子爱心代码的例子: ```python import turtle import random # 初始化 turtle.setup(width=800, height=600) turtle.bgcolor('black') turtle.title('3D Particle Heart') # 定义粒子类 class Particle(turtle.Turtle): def __init__(self): turtle.Turtle.__init__(self, shape='circle', visible=False) self.penup() self.speed(0) self.velocity = [random.uniform(-1, 1), random.uniform(-1, 1), random.uniform(-1, 1)] self.x = 0 self.y = 0 self.z = 0 self.gravity = -0.01 self.color(random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)) self.visible = True # 更新粒子位置 def move(self): self.velocity[1] += self.gravity self.x += self.velocity[0] self.y += self.velocity[1] self.z += self.velocity[2] self.goto(self.x, self.y) if self.z < -200: self.visible = False self.goto(0, 0) self.velocity = [random.uniform(-1, 1), random.uniform(-1, 1), random.uniform(-1, 1)] self.x = 0 self.y = 0 self.z = 0 self.gravity = -0.01 self.color(random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)) self.visible = True # 创建粒子列表 particles = [] for i in range(100): particles.append(Particle()) # 绘制爱心 def heart(x, y, size): turtle.penup() turtle.goto(x, y) turtle.pendown() turtle.color('red') turtle.pensize(size) turtle.begin_fill() turtle.left(45) turtle.forward(100*size) turtle.circle(50*size, 180) turtle.right(90) turtle.circle(50*size, 180) turtle.forward(100*size) turtle.end_fill() # 主循环 while True: for particle in particles: particle.move() if particle.visible: particle.showturtle() else: particle.hideturtle() heart(0, -50, 1) turtle.update() # 结束 turtle.done() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值