大家好,小编来为大家解答以下问题,python代码画动态烟花,Word文档,html烟花代码大全可复制免费,今天让我们一起来看看吧!
Source code download: 本文相关源码
大家好,本文将围绕python画烟花绽放出字展开说明,python代码画动态烟花是一个很多人都想弄明白的事情,想搞清楚用python画烟花代码需要先了解以下几个事情。
做了一个Python的小项目python引用turtle画蝴蝶。利用了一点python的可视化技巧,做出烟花绽放的效果,文章的灵感来自网络上一位大神高中信息技术python实验。
一.编译环境
Pycharm
二.模块
1.tkinter:这个小项目的主角,是一个python图形模块。且Python3已经自带了该模块,不用另外安装。它有点像java中的swing图形模块(由众多组件集成,组件通过创建实例添加,组件通过坐标定位在窗口上)。
2.PIL:Python Imaging Library,是Python平台的图像处理标准模块。在Python3也是自带的,在这个项目中用于背景图片的导入。
3.time:相信这个模块大家都不会陌生,导入它用来控制烟花的绽放,坠落及消失时间。
4.random:随机数模块,用于生成烟花随机坐标点,随机绽放速度,随机消失时间。
5.math:这个模块大家应该也很熟悉了,导入它的目的是使烟花绽放的粒子以一定角度散开。
三.效果
项目最终实现的效果就跟上面一样了。
四.代码
以下是我学习(copy)了那位大神的代码,再添加了一些浅显的注解。
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
#重力变量
GRAVITY=0.5
#listof colors,can choose randomly or use as queue(FIFO
colors=['red','blue','yellow','white','green','orange','purple','seagreen','indigo','cornflowerblue']
'''
create a class for particles粒子
particles are emitted almost randomly on the sky,
forming around(组成一个圈) of circle(a star)before falling and getting removed from canvas
Attributes(属性):
id:每个特定烟花的标识符
x,y:烟花的绽放坐标
vx,vy:烟花的绽放速度
total:一颗烟花里的星星总数
age:一颗星星会在画布上停留多久
color:自我移植
cv:画布
lifespan:星星在画布上停留的最后时间
'''
class part:#为每一个烟花绽放出来的粒子单独构建一个类的对象
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#每个烟花的特定标识符
self.x=x#烟花的绽放x轴
self.y=y#烟花的绽放x轴
self.initial_speed=explosion_speed#初速度
self.vx=vx#外放x轴速度
self.vy=vy#外放y轴速度
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)#create_oval()创建一个椭圆,参数为左上x,左上y,右下x,右下y,填满的颜色,该函数返回一个id
self.lifespan=lifespan#应该停留时间
def update(self,dt):#更新数据,已停留时间增加
self.age+=dt
#粒子膨胀
if self.alive() and self.expand():#如果停留时间(2s)足够&&膨胀时间(1.2s)足够
move_x=cos(radians(self.id*360/self.total))*self.initial_speed#粒子的x轴继续膨胀
move_y=sin(radians(self.id*360/self.total))*self.initial_speed#粒子的y轴继续膨胀
self.cv.move(self.cid, move_x, move_y)#根据id把画布上的粒子移动x和y个距离
self.vx=move_x/(float(dt)*1000)
#以自由落体坠落
elif self.alive():#如果只是停留时间足够,说明膨胀到最大了,应该准备下坠
move_x=cos(radians(self.id*360/self.total))#x轴继续膨胀
self.cv.move(self.cid,self.vx+move_x,self.vy+GRAVITY*dt)#而y轴按照重力因素做落体运动,但实际上这个重力是v而不是a
self.vy+=GRAVITY*dt#更新一下y轴
elif self.cid is not None:#如果粒子的生命周期已过,就将其移除
cv.delete(self.cid)#删除该粒子对象
self.cid=None
#定义膨胀效果的时间帧
def expand(self):
return self.age<=1.2#膨胀时间小于1.2s
#检查粒子是否仍在生命周期内
def alive(self):#已停留时间是不是比应该停留时间短
return self.age<=self.lifespan
'''
烟花模拟回路:
递归调用来在画布上重复发出新的烟火
通过每个“部件”对象内部的更新协议,每次调用时都要在画布上创建并绘制列表(星列表,每个星列表成员都是粒子列表)来重复地在画布上发出新的焰火
'''
#生成新的一轮爆炸
def simulate(cv):
t=time()#time()函数返回自1970年后经过的浮点秒数,精确到小数点后6位
explode_points=[]#爆炸点列表--烟花列表
wait_time=randint(10,100)#随机生成一个int n,10<=n<=100
numb_explode=randint(6,10)#爆炸的个数是6~10
#为所有模拟烟花绽放的全部例子创建一列列表
for point in range(numb_explode):#遍历爆炸的个数
objects=[]#这是每个点的爆炸粒子列表
x_cordi=randint(50,550)#每个点的爆炸x轴
y_cordi=randint(50,150)#爆炸y轴
speed=uniform(0.5,1.5)#随机生成一个float speed,0.5<=speed<1.5
size=uniform(0.5,3)#随机生成一个float size,0.5<=size<3
color=choice(colors)#choice()是python内置函数,随机返回元组,列表,或字符串的一个成员
explosion_speed=uniform(0.2,1)#爆炸的绽放速度也要随机出来
total_particles=randint(10,50)#爆炸出来的粒子数半径也随机
for i in range(1,total_particles):#同一个烟花爆炸出来的粒子的大小,速度,坐标都是相同的
r = part(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#先把时间置0
#在1.8秒时间帧内保持更新
while total_time<1.8:
sleep(0.01)#让画面暂停0.01s
tnew=time()#刷新时间
t,dt=tnew,tnew-t#时间等于新时间,与上次时间间隔为tnew-t
for point in explode_points:#遍历烟花列表
for item in point:#遍历烟花里的粒子列表
item.update(dt)#更新时间
cv.update()#刷新页面
total_time+=dt#为上面的while循环增加时间
root.after(wait_time,simulate,cv)#将组件置于其他组件之后,就是放在最顶层,覆盖下面的,这里递归第哦啊用了自己,形成新的一轮爆炸
def close(*ignore):
#打开模拟循环并关闭窗口
global root
root.quit()
if __name__=="__main__":
root=tk.Tk()
cv=tk.Canvas(root,height=600,width=700)#绘制一个画布
#绘制一个黑色背景
#cv.create_rectangle(0,0,600,600,fill="black")
#use a nice background image
image=Image.open("L:\PyCharm Community Edition 2018.2.2\Python_program\image.jpg")
photo=ImageTk.PhotoImage(image)
cv.create_image(0,0,image=photo,anchor='nw')#在画板上绘制一张图片
cv.pack()#把cv添加进去
root.protocol("WM_DELETE_WINDOW",close)
#在0.1s后才开始调用stimulate()
root.after(100,simulate,cv)#调用stimulate生成一轮烟花绽放效果
root.mainloop()#执行root,生成窗口
#让我更加明白了python的一切皆对象
五.结尾
这篇博客暂时就这样,如果有机会会重新做一遍,不过最大的可能就是遥遥无期了。先打算对项目做如下修改:
1.增加鼠标交互功能,用户鼠标点击位置额外生成烟花绽放;
2.增加文字绘制功能,在背景图中隐藏有字样,烟花绽放后落于字样中的粒子不消失,而是定格在窗口中。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
时间: 2019-01-28
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法