python写新年快乐程序_新年快乐!python实现绚烂的烟花绽放
效果
新年快乐! python实现绚烂的烟花绽放效果
来源:中⽂源码⽹ 浏览: 次 ⽇期:2019年11⽉5⽇
【下载⽂档: 新年快乐! python实现绚烂的烟花绽放效果.txt 】
(友情提⽰:右键点上⾏txt⽂档名->⽬标另存为)
新年快乐! python实现绚烂的烟花绽放效果做了⼀个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 canvasAttributes(属性):
id:每个特定烟花的标识符
x,y:烟花的绽放坐标
vx,vy:烟花的绽放速度
total:⼀颗烟花⾥的星星总数
age:⼀颗星星会在画布上停留多久
color:⾃我移植
cv:画布
lifespan:星星在画布上停留的最后时间
'''
class part:#为每⼀个烟花绽放出来的粒⼦单独构建⼀个类的对象
python中文文档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.age=0#已停留时间
self.cv=cv#画布
self.cid=ate_oval(x-size,y-size,x+size,y+size,lor)#create_oval()创建⼀个椭圆,参数为左上x,左上y,右下x,右下y,填满的颜⾊,该函数返回⼀个id
self.lifespan=lifespan#应该停留时间
def update(self,dt):#更新数据,已停留时间增加
self.age+=dt
#粒⼦膨胀
if self.alive() pand():#如果停留时间(2s)⾜够&&膨胀时间(1.2s)⾜够
move_x=cos(radians(self.id*al))*self.initial_speed#粒⼦的x轴继续膨胀
move_y=sin(radians(self.id*al))*self.initial_speed#粒⼦的y轴继续膨胀
ve(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*al))#x轴继续膨胀
ve(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.pack()#把cv添加进去
root.protocol("WM_DELETE_WINDOW",close)
#在0.1s后才开始调⽤stimulate()
root.after(100,simulate,cv)#调⽤stimulate⽣成⼀轮烟花绽放效果
root.mainloop()#执⾏root,⽣成窗⼝
#让我更加明⽩了python的⼀切皆对象五.结尾这篇博客暂时就这样,如果有机会会重新做⼀遍,不过最⼤的可能就是遥遥⽆期了。先打算对项⽬做如下修改:1.增加⿏标交互功能,⽤户⿏标点击位置额外⽣成烟花绽放;2.增加⽂字绘制功能,在背景图中隐藏有字样,烟花绽放后落于字样中的粒⼦不消失,⽽是定格在窗⼝中。以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持中⽂源码⽹。
亲,试试扫码分享本页! *^_^*
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论