python画烟花绽放出字,python如何制作烟花

这篇文章介绍了如何使用Python的Tkinter库创建一个具有烟花绽放效果的程序,结合PIL处理图像和time库控制时间,实现动态烟花动画。
摘要由CSDN通过智能技术生成

大家好,给大家分享一下python画烟花绽放出字,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!

一、说明

        用python实现一些小游戏,所依赖的包,基本有:tkinter、PIL、以及数学、时间等一系列包;本文介绍一个实现烟花效果的小程序。

二、依赖包分解

2.1 窗口依赖tkinter

        Tkinter是Python的标准图形用户界面(GUI)工具包python怎么使用已经训练好的模型。它是一个用于构建GUI应用程序的模块,可以创建窗口和各种控件,如按钮、标签、文本框、列表框等。

        通过Tkinter,我们可以创建各种GUI应用程序,比如计算器、文本编辑器、图形化界面的程序等。Tkinter提供了丰富的功能,可以满足大多数GUI应用程序的需求。

        以下是一个使用Tkinter创建一个简单窗口的示例代码:

mport tkinter as tk

# 创建窗口
root = tk.Tk()
root.title("Hello Tkinter")

# 创建标签
label = tk.Label(root, text="Hello World!")
label.pack()

# 运行窗口
root.mainloop()

        运行这段代码,就可以看到一个简单的窗口,其中包含一个标签,显示了“Hello World!”这个文本。

2.3 图片处理pil

        PIL (Python Imaging Library) 是处理图像的 Python 库,使得 Python 可以方便地加载、处理和保存各种图像格式,例如 JPEG、PNG、GIF、BMP、TIFF 等等。PIL 提供了各种图像处理工具,例如缩放、剪裁、旋转、滤镜等等,也可以进行图像格式转换和色彩空间转换。PIL 库在 Python 2 中支持得较好,但在 Python 3 中需要安装 Pillow 库才能使用。Pillow 是 PIL 库在 Python 3 中的一个分支,提供了对 Python 3 的支持,并加入了新的功能。

2.4 time库

        time库是Python标准库中的一个模块,它提供了与时间相关的函数。以下是time库的一些常用函数:

  1. time():获取当前时间戳,即从1970年1月1日0时0分0秒开始到现在的秒数。
  2. localtime():获取本地时间,返回一个time.struct_time结构体对象,包含年、月、日、时、分、秒等信息。
  3. strftime():将时间格式化为指定的字符串形式。
  4. mktime():将一个time.struct_time结构体对象转换为时间戳。
  5. sleep():先让程序暂停一定的时间,以便在这段时间内执行其他任务。

使用time库可轻松地操作时间,比如计时器、计算程序运行时间、控制程序等待等功能。

三、用tkinter实现一个实现烟花的程序


import tkinter as tk
from PIL import Image, ImageTk
from time import time, sleep
from random import choice, uniform, randint
from math import sin, cos, radians
colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']
class fireworks:
    def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2, **kwargs):
        self.id = idx
        # 烟花绽放 x 轴
        self.x = x
        # 烟花绽放 x 轴
        self.y = y
        self.initial_speed = explosion_speed
        # 外放 x 轴速度
        self.vx = vx
        # 外放 y 轴速度
        self.vy = vy
        # 绽放的粒子数
        self.total = total
        # 已停留时间
        self.age = 0
        # 颜色
        self.color = color
        # 画布
        self.cv = cv
        self.cid = self.cv.create_oval(x - size, y - size, x + size, y + size,
        fill=self.color)
        self.lifespan = lifespan

    # 更新数据
    def update(self, dt):
        self.age += dt
        # 粒子膨胀
        if self.alive() and self.expand():
            move_x = cos(radians(self.id * 360 / self.total)) * self.initial_speed
            move_y = sin(radians(self.id * 360 / self.total)) * self.initial_speed
            self.cv.move(self.cid, move_x, move_y)
            self.vx = move_x / (float(dt) * 1000)
        # 膨胀到最大下落
        elif self.alive():
            move_x = cos(radians(self.id * 360 / self.total))
            self.cv.move(self.cid, self.vx + move_x, self.vy + 0.5 * dt)
            self.vy += 0.5 * dt
        # 过期移除
        elif self.cid is not None:
            cv.delete(self.cid)
            self.cid = None

    # 定义膨胀效果的时间帧
    def expand(self):
        return self.age <= 1.5

    # 检查粒子是否仍在生命周期内
    def alive(self):
        return self.age <= self.lifespan

def ignite(cv):
    t = time()
    # 烟花列表
    explode_points = []
    wait_time = randint(10, 100)
    # 爆炸的个数
    numb_explode = randint(6, 10)
    for point in range(numb_explode):
        # 爆炸粒子列表
        objects = []
        # 爆炸 x 轴
        x_cordi = randint(50, 550)
        # 爆炸 y 轴
        y_cordi = randint(50, 150)
        speed = uniform(0.5, 1.5)
        size = uniform(0.5, 3)
        color = choice(colors)
        # 爆炸的绽放速度
        explosion_speed = uniform(0.2, 1)
        # 爆炸的粒子数半径
        total_particles = randint(10, 50)
        for i in range(1, total_particles):
            r = fireworks(cv, idx=i, total=total_particles, explosion_speed=explosion_speed, x=x_cordi, y=y_cordi,
                     vx=speed, vy=speed, color=color, size=size,
                     lifespan=uniform(0.6, 1.75))
            # 添加进粒子列表里
            objects.append(r)
        # 把粒子列表添加到烟花列表
        explode_points.append(objects)
    total_time = .0
    # 在 1.8 秒时间帧内保持更新
    while total_time < 1.8:
        # 让画面暂停 0.01s
        sleep(0.01)
        # 刷新时间
        tnew = time()
        t, dt = tnew, tnew - t
        # 遍历烟花列表
        for point in explode_points:
            # 遍历烟花里的粒子列表
            for item in point:
                # 更新时间
                item.update(dt)
        # 刷新页面
        cv.update()
        total_time += dt
    root.after(wait_time, ignite, cv)

if __name__ == "__main__":
    root = tk.Tk()
    # 绘制一个画布
    cv = tk.Canvas(root, height=400, width=600)
    # 背景图
    image = Image.open("D001.jpg")
    photo = ImageTk.PhotoImage(image)
    # 在画板上绘制一张图片
    cv.create_image(0, 0, image=photo, anchor='nw')
    cv.pack()
    root.protocol(colors)
    root.after(100, ignite, cv)
    # 生成窗口
    root.mainloop()

四、实现效果 

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值