2021即将结束,2022即将到来。在本文中,我们使用Python为您送上一场跨年烟花秀。我们使用的Python模块包括:tkinter、PIL、time、random和math。如果没有安装第三方模块,只需pipinstall即可。我们来看看代码实现。引导库importtkinterastkfromPILimportImage,ImageTkfromtimeimporttime,sleepfromrandomimportchoice,uniform,randintfrommathimportsin,cos,radians烟花颜色colors=['red','blue','yellow','white','green','orange','purple','seagreen','indigo','cornflowerblue']1定义烟花类fireworks:def__init__(self,cv,idx,total,explosion_speed,x=0.,y=0.,vx=0.,vy=0.,size=2.,color='red',lifetime=2,**kwargs):self.id=idx#烟花绽放x轴self.x=x#烟花绽放x轴self.y=yself.initial_speed=explosion_speed#向外x轴速度self.vx=vx#向外y轴速度self.vy=vy#绽放粒子数self.total=total#停止时间self.age=0#颜色self.color=color#canvasself.cv=cvself.cid=self.cv.create_oval(x-size,y-size,x+size,y+size,fill=self.color)self.lifespan=lifetime更新数据defupdate(self,dt):self.age+=dt#粒子膨胀ifself.alive()andself.expand():move_x=cos(radians(self.id*/self.total))*self.initial_speedmove_y=sin(radians(self.id*360/self.total))*self.initial_speedself.cv.move(self.cid,move_x,move_y)self.vx=move_x/(float(dt)*1000)#膨胀到最大下载elifself.alive():move_x=cos(弧度(self.id*360/self.total))self.cv.move(self.cid,self.vx+move_x,self.vy+0.5*dt)self.vy+=0.5*dt#过期移除elifself.cidisnotNone:cv.delete(self.cid)self.cid=None#定义扩展的时间范围defexpand(self):returnself.age<=1.5#检查粒子是否还活着defalive(self):returnself.age<=self.lifespanfireworkdefignite(cv):t=time()#烟花列表explode_points=[]wait_time=randint(10,100)#爆炸次数numb_explode=randint(6,10)forpointinrange(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)#爆炸的Bloom速度explosion_speed=uniform(0.2,1)#爆炸的粒子数半径total_particles=randint(10,50)foriinrange(1,total_particles):r=烟花(cv,idx=i,total=total_particles,explosion_speed=explosion_speed,x=x_cordi,y=y_cordi,vx=speed,vy=speed,color=color,size=size,lifetime=uniform(0.6,1.75))#添加到粒子列表objects.append(r)#将粒子列表添加到烟花列表explode_points.append(objects)total_time=.0#在1.8秒时间范围内保持更新whiletotal_time<1.8:#暂停屏幕0.01ssleep(0.01)#刷新时间tnew=time()t,dt=tnew,tnew-t#遍历烟花列表forpointinexplode_points:#遍历烟花粒子列表foriteminpoint:#更新时间项.update(dt)#刷新页面cv.update()total_time+=dtroot.after(wait_time,ignite,cv)startif__name__=="__main__":root=tk.Tk()#绘制画布cv=tk.Canvas(root,height=400,width=600)#背景图片image=Image.open("bg.jpg")photo=ImageTk.PhotoImage(image)#在画板上画一张图cv.create_image(0,0,image=photo,anchor='nw')cv.pack()root.protocol(close)root.after(100,ignite,cv)#生成窗口root.mainloop()看效果:
