目录

前言

Python界面设计之Tkinter

简单创建一个界面

在界面上创建画布

导入图片到界面中

其他一些重要函数

用Python画一场烟花秀

烟花的粒子类

烟花秀的实现

完整程序


前言

新年即将来临,在这个举国欢庆的日子里,怎么能少的了灿烂又热烈的烟花秀呢!既然不让我们在线下燃放烟花爆竹,那就让我们一起来画一场烟花秀,送给你最在意的那个人叭~

Python界面设计之Tkinter

相信学过Python的小伙伴们都知道tkinter包吧,它是Python界面设计的一个基础的包,里面包含了丰富的控件,对于新手来说,要设计一个简单的界面,用它最合适不过了,由于我们的烟花秀最终是用它来实现的,所以在这里我们来简单介绍一下它叭~

如果想深入了解tkinter包的话,欢迎来这里学习:

https://blog.csdn.net/m0_68111267/category_12163598.html

简单创建一个界面

root=tk.Tk()    #创建界面root
root.title()    #给界面命名
root.geometry()  #设置界面大小
root.mainloop()  #将界面持续放在屏幕上

在界面上创建画布

tk.Canvas(root,width,height)   #在root界面上创建一个宽为width,高为height的画布

由于我们会用到在画布里面画一个圆的函数,所以我在这里简单对其进行一下介绍:

Canvas.create_oval(x0,y0,x1,y1):在画布中画一个椭圆,x0,y0为椭圆最左上角,x1,y1为椭圆最右下角

导入图片到界面中

image=Image.open()    #打开一张图片
ImageTk.PhotoImage(image)    #将图片转成tkinter可识别的格式
canvas.create_image()       #在画布中导入该图片

其他一些重要函数

time.time()函数:获取当前时间戳

time.sleep()函数:暂停当前界面

random.choice()函数:在列表中随机取一个元素

random.uniform()函数:随机生成一个小数

random.randint()函数:随机生成一个整数

math.cos()函数:正弦函数

math.sin()函数:余弦函数

math.radians()函数:将角度制转换为弧度制

root.after()函数:在规定时间后,刷新当前界面

root.quit()函数:退出当前界面

用Python画一场烟花秀

烟花的粒子类

class particle:     #烟花的粒子类
    def __init__(self,canvas,num,sums,x,y,x_speed,y_speed,explosion_speed,color,size,max_life):
        self.canvas=canvas    #画布
        self.num=num          #粒子的序号
        self.sums=sums        #粒子的个数
        self.x=x              #粒子的横向坐标
        self.y=y              #粒子的纵向坐标
        self.x_speed=x_speed    #粒子在横向的移动速度
        self.y_speed=y_speed    #粒子在纵向的移动速度
        self.initial_speed=explosion_speed    #粒子的初始速度
        self.color=color       #粒子的颜色
        self.life=0            #粒子当前存活的时间
        self.max_life=max_life   #粒子最大的存活时间
        self.oval=self.canvas.create_oval(x-size,y-size,x+size,y+size,fill=self.color)   #粒子的范围(烟花的大小)
    def expand(self):    #判断粒子是否还在爆炸
        if self.life<=1.5:    #粒子是否到达最大爆炸时间
            return 1
        else:
            return 0
    def alive(self):     #判断粒子是否存活
        if self.life<=self.max_life:     #粒子是否到达最大存活时间
            return 1
        else:
            return 0
    def new(self,dt):    #更新当前烟花的粒子位置
        self.life=self.life+dt   #更新当前存活时间
        if self.alive() and self.expand():   #如果当前存活时间在爆炸时间内
            move_x=m.cos(m.radians(self.num*360/self.sums))*self.initial_speed   #则执行爆炸,更新横向坐标
            move_y=m.sin(m.radians(self.num*360/self.sums))*self.initial_speed   #更新纵向坐标
            self.canvas.move(self.oval,move_x,move_y)    #在画布上更新烟花
            self.x_speed=move_x/(float(dt)*1000)    #烟花绽放的速度
        elif self.alive():    #如果爆炸结束了,但粒子还存在,则开始坠落
            move_x=m.cos(m.radians(self.num*360/self.sums))    #更新横向坐标
            self.canvas.move(self.oval,self.x_speed+move_x,self.y_speed+0.05*dt)  #在画布上更新烟花
            self.y_speed=self.y_speed+0.5*dt     #烟花坠落的速度
        elif self.oval is not None:    #如果在坠落的时间外了,就将烟花从画布上擦除
            canvas.delete(self.oval)
            self.oval=None

烟花秀的实现

def fireworks(canvas):#烟花函数(循环更新当前界面)
    times=ti.time()       #获取当前时间戳
    explode_points=[]     #烟花列表
    wait_time=r.randint(1,10)      #等待时间
    num_explode=r.randint(20,30)     #烟花的个数
    for point in range(num_explode):     #依次更新各个烟花
        firework=[]      #当前烟花的粒子列表
        x=r.randint(50,550)   #当前烟花的粒子在横向的活动范围
        y=r.randint(50,150)   #当前烟花的粒子在纵向的活动范围
        speed=r.uniform(0.5,2)   #粒子的绽放速度
        size=r.uniform(0.5,1.5)    #粒子的大小
        color=r.choice(colors)     #粒子的颜色
        explosion_speed=r.uniform(0.2,5)    #粒子爆炸的速度
        sum_particles=r.randint(30,50)      #粒子的总数
        max_life=r.uniform(0.6,1.75)        #粒子的最大存活时间
        for i in range(1,sum_particles):   #当前烟花的每个粒子的参数
            fire=particle(canvas,num=i,sums=sum_particles,explosion_speed=explosion_speed,x=x,y=y,x_speed=speed,y_speed=speed,color=color,size=size,max_life=max_life)
            firework.append(fire)    #将当前粒子加入到当前的烟花粒子列表中
        explode_points.append(firework)   #将当前烟花加入到烟花列表中
    expand_time=0     #初始爆炸的时间
    while expand_time<2:    #如果爆炸的时间小于2
        ti.sleep(0.001)     #爆炸帧
        newtime=ti.time()   #获取爆炸一次的时间戳
        times,dt=newtime,newtime-times    #更新当前的时间戳
        for point in explode_points:     #更新所有的粒子位置
            for item in point:
                item.new(dt)
        canvas.update()    #更新当前画布
        expand_time=expand_time+dt   #更新当前的爆炸时间
    global root   #root界面是全局变量
    root.after(wait_time,fireworks,canvas)

完整程序

源码见文章底部微信公众号喔~

import tkinter as tk            #导入tkinter包
from PIL import Image,ImageTk    #导入PIL包中的Image包和ImageTk包,用于打开图片,用作烟花的背景
import time as ti               #导入时间包
import math as m                #导入数学包
import random as r              #导入随机包
colors=['red','blue','lime','yellow','white','cyan','orange','deepskyblue','orangered']   #烟花的颜色
class particle:     #烟花的粒子类
    def __init__(self,canvas,num,sums,x,y,x_speed,y_speed,explosion_speed,color,size,max_life):
        self.canvas=canvas    #画布
        self.num=num          #粒子的序号
        self.sums=sums        #粒子的个数
        self.x=x              #粒子的横向坐标
        self.y=y              #粒子的纵向坐标
        self.x_speed=x_speed    #粒子在横向的移动速度
        self.y_speed=y_speed    #粒子在纵向的移动速度
        self.initial_speed=explosion_speed    #粒子的初始速度
        self.color=color       #粒子的颜色
        self.life=0            #粒子当前存活的时间
        self.max_life=max_life   #粒子最大的存活时间
        self.oval=self.canvas.create_oval(x-size,y-size,x+size,y+size,fill=self.color)   #粒子的范围(烟花的大小)
    def expand(self):    #判断粒子是否还在爆炸
        if self.life<=1.5:    #粒子是否到达最大爆炸时间
            return 1
        else:
            return 0
    def alive(self):     #判断粒子是否存活
        if self.life<=self.max_life:     #粒子是否到达最大存活时间
            return 1
        else:
            return 0
    def new(self,dt):    #更新当前烟花的粒子位置
        self.life=self.life+dt   #更新当前存活时间
        if self.alive() and self.expand():   #如果当前存活时间在爆炸时间内
            move_x=m.cos(m.radians(self.num*360/self.sums))*self.initial_speed   #则执行爆炸,更新横向坐标
            move_y=m.sin(m.radians(self.num*360/self.sums))*self.initial_speed   #更新纵向坐标
            self.canvas.move(self.oval,move_x,move_y)    #在画布上更新烟花
            self.x_speed=move_x/(float(dt)*1000)    #烟花绽放的速度
        elif self.alive():    #如果爆炸结束了,但粒子还存在,则开始坠落
            move_x=m.cos(m.radians(self.num*360/self.sums))    #更新横向坐标
            self.canvas.move(self.oval,self.x_speed+move_x,self.y_speed+0.05*dt)  #在画布上更新烟花
            self.y_speed=self.y_speed+0.5*dt     #烟花坠落的速度
        elif self.oval is not None:    #如果在坠落的时间外了,就将烟花从画布上擦除
            canvas.delete(self.oval)
            self.oval=None
def fireworks(canvas):#烟花函数(循环更新当前界面)
    times=ti.time()       #获取当前时间戳
    explode_points=[]     #烟花列表
    wait_time=r.randint(1,10)      #等待时间
    num_explode=r.randint(20,30)     #烟花的个数
    for point in range(num_explode):     #依次更新各个烟花
        firework=[]      #当前烟花的粒子列表
        x=r.randint(50,550)   #当前烟花的粒子在横向的活动范围
        y=r.randint(50,150)   #当前烟花的粒子在纵向的活动范围
        speed=r.uniform(0.5,2)   #粒子的绽放速度
        size=r.uniform(0.5,1.5)    #粒子的大小
        color=r.choice(colors)     #粒子的颜色
        explosion_speed=r.uniform(0.2,5)    #粒子爆炸的速度
        sum_particles=r.randint(30,50)      #粒子的总数
        max_life=r.uniform(0.6,1.75)        #粒子的最大存活时间
        for i in range(1,sum_particles):   #当前烟花的每个粒子的参数

……

【新年快乐】禁止燃放烟花爆竹那就用Python画场烟花秀吧相关推荐

  1. python画春节_快到春节了,用Python来一场烟花秀

    原标题:快到春节了,用Python来一场烟花秀 作者:野客 来源:Python 技术(pythonall) 大家好,欢迎来到 Crossin的编程教室 ! 春节的脚步越来越近了,每逢春节很多地方都会燃 ...

  2. 快到春节了,用 Python 实现一场烟花秀

    春节的脚步越来越近了,每逢春节很多地方都会燃放烟花来增添节日的气氛,然而因环境污染的加剧,近年来不少地方已经禁止燃放烟花了,为了弥补这个遗憾,本文我们来看一下如何使用 Python 来实现一场烟花秀. ...

  3. 庆祝法国队夺冠:用Python放一场烟花秀

    2019独角兽企业重金招聘Python工程师标准>>> 天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用Python模拟出绽放的烟花庆祝昨晚法国队夺冠,工作之余 ...

  4. 代码也浪漫:用Python放一场烟花秀!

    来源:集智小编        链接: https://jizhi.im/blog/post/py_make_fireworks 天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用P ...

  5. python引用turtle画烟花_代码也浪漫:用Python放一场烟花秀!

    天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用Python模拟出绽放的烟花,工作之余也可以随时让程序为自己放一场烟花秀. 这个有趣的小项目并不复杂,只需一点可视化技巧,100余 ...

  6. 七夕节马上到了,有对象的,无对象的必备神奇用Python做一个烟花秀

    今天已经周三了还有三天就是七夕节了,要给女朋友买礼物怕是来不及了! 那怎么办呢?那么就给她准备一个就全城烟花视频吧. 可除了土豪,不是所有人都能在整个城市放烟花的.对于一个普通的不能再普通的我也只能想 ...

  7. python画静态烟花_新年快乐! python实现绚烂的烟花绽放效果

    做了一个Python的小项目.利用了一点python的可视化技巧,做出烟花绽放的效果,文章的灵感来自网络上一位大神. 一.编译环境 Pycharm 二.模块 1.tkinter:这个小项目的主角,是一 ...

  8. python画静态烟花_人人都可以写的可视化Python小程序第二篇:旋转的烟花

    兴趣是最好的老师 枯燥的编程容易让人放弃,兴趣才是最好的老师.无论孩子还是大人,只有发现这件事情真的有趣,我们才会非常执着的去做这件事,比如打游戏.如果编程能像玩游戏一样变得有趣,我相信很多人就特别愿 ...

  9. python炫酷烟花表白源代码,用python画烟花的代码

    大家好,小编为大家解答python绘制烟花特定爆炸效果的问题.很多人还不知道python炫酷烟花表白源代码,现在让我们一起来看看吧! 1.放烟花的代码 放烟花的代码相关内容如下: 烟花其实可以看成由一 ...

最新文章

  1. 汉语分词工具的研发-----
  2. mysql同步binlog_利用MySQL的Binlog实现数据同步与订阅(下)
  3. Java并发编程(9):死锁(含代码)
  4. 程序员从入门到升级,或许可以看一看这几个公众号
  5. vba cad 获取宏的路径_VBA批量创建文件目录及链接,建议收藏备用
  6. socket用起始码分割_常用条码Code128码及EAN13码的介绍
  7. 智能算法!数据平台自动生成报表,智慧景区的可视化有什么不同
  8. Twemproxy测试Redis分片主从架构
  9. linux 更改配置文件 禁止ssh,配置linux用户实现禁止ssh登陆但可用sftp登录
  10. Linux检查CPU过高的原因
  11. 一边撸猫一边写代码,Linus Torvalds 谈在家办公
  12. [SDOI2011]打地鼠
  13. webpack vue-cli 常见问题总结
  14. 得到 jason中 string 的值_简单高性能的Json解析器: Jason
  15. android10禁用华为桌面,华为禁用第三方桌面 简介办法
  16. 移动端 设计师设计APP UI常用软件总结
  17. Excel破解宏密码
  18. EndeavourOS安装配置全攻略!
  19. PRODUCT_CHARACTERISTICS 详解
  20. 监控视频服务器协议,教你用Spcaserv架设网络视频监控 - 网络协议 - 电子发烧友网...

热门文章

  1. 技术封锁来了!GitHub 封杀「美国贸易制裁国家」的开发人员
  2. 云顶之奕账号服务器的缩写,LOL云顶之弈美服账号怎么注册 英雄联盟自走棋美服测试服注册方法...
  3. ubuntu解压命令全览(rar)
  4. 鼓音源混音教程|为什么制作人都偏爱鼓音源、采样制作专辑?|MZD Studios
  5. windows平台下VLC2.0.5编译
  6. 人脸识别--活体检测(眨眼检测)
  7. 机械电子工程中的计算机思维,人工智能技术在机械电子工程领域的应用
  8. Android Studio 基础入门笔记
  9. C++高级编程资料汇总(参考手册+电子书+编程思想+算法分析) ...
  10. 互联网打响云上争夺战:从计算到生态