python实现烟花小程序


Posted in Python onJanuary 30, 2019

本文实例为大家分享了python实现烟花小程序的具体代码,供大家参考,具体内容如下

'''
FIREWORKS SIMULATION WITH TKINTER
*self-containing code
*to run: simply type python simple.py in your console
*compatible with both Python 2 and Python 3
*Dependencies: tkinter, Pillow (only for background image)
*The design is based on high school physics, with some small twists only for aesthetics purpose
 
import tkinter as tk
#from tkinter import messagebox
#from tkinter import PhotoImage
from PIL import Image, ImageTk
from time import time, sleep
from random import choice, uniform, randint
from math import sin, cos, radians
# gravity, act as our constant g, you can experiment by changing it
GRAVITY = 0.05
# list of color, can choose randomly or use as a queue (FIFO)
colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen','indigo', 'cornflowerblue']
Generic class for particles
particles are emitted almost randomly on the sky, forming a round of circle (a star) before falling and getting removed
from canvas
Attributes:
 - id: identifier of a particular particle in a star
 - x, y: x,y-coordinate of a star (point of explosion)
 - vx, vy: speed of particle in x, y coordinate
 - total: total number of particle in a star
 - age: how long has the particle last on canvas
 - color: self-explantory
 - cv: canvas
 - lifespan: how long a particle will last on canvas
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
  self.y = y
  self.initial_speed = explosion_speed
  self.vx = vx
  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
  # particle expansions
  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)
  # falling down in projectile motion
  elif self.alive():
   move_x = cos(radians(self.id*360/self.total))
   # we technically don't need to update x, y because move will do the job
   self.cv.move(self.cid, self.vx + move_x, self.vy+GRAVITY*dt)
   self.vy += GRAVITY*dt
  # remove article if it is over the lifespan
  elif self.cid is not None:
   cv.delete(self.cid)
   self.cid = None
 # define time frame for expansion
 def expand (self):
  return self.age <= 1.2
 # check if particle is still alive in lifespan
 def alive(self):
  return self.age <= self.lifespan
Firework simulation loop:
Recursively call to repeatedly emit new fireworks on canvas
a list of list (list of stars, each of which is a list of particles)
is created and drawn on canvas at every call, 
via update protocol inside each 'part' object 
def simulate(cv):
 t = time()
 explode_points = []
 wait_time = randint(10,100)
 numb_explode = randint(6,10)
 # create list of list of all particles in all simultaneous explosion
 for point in range(numb_explode):
  objects = []
  x_cordi = randint(50,550)
  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 = 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
 # keeps undate within a timeframe of 1.8 second
 while total_time < 1.8:
  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
 # recursive call to continue adding new explosion on canvas
 root.after(wait_time, simulate, cv)
def close(*ignore):
 """Stops simulation loop and closes the window."""
 global root
 root.quit()
 
if __name__ == '__main__':
 root = tk.Tk()
 cv = tk.Canvas(root, height=600, width=600)
 # use a nice background image
 image = Image.open("./image1.jpg")#背景照片路径自行选择,可以选择酷炫一点的,看起来效果会#更好
 photo = ImageTk.PhotoImage(image)
 cv.create_image(0, 0, image=photo, anchor='nw')
 cv.pack()
 root.protocol("WM_DELETE_WINDOW", close)
 root.after(100, simulate, cv)
 root.mainloop()

注意:这里需要安装tkinter,安装过程:

step1:

>>> import _tkinter # with underscore, and lowercase 't'

step2:

>>> import Tkinter # no underscore, uppercase 'T' for versions prior to V3.0

>>> import tkinter # no underscore, lowercase 't' for V3.0 and later

step3:

>>> Tkinter._test() # note underscore in _test and uppercase 'T' for versions prior to V3.0 

>>> tkinter._test() # note underscore in _test and lowercase 'T' for V3.0 and later

然后就可以运行了,在代码中有一个背景照片部分,路径可自行选择!我这里就不修改了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python自动连接ssh的方法
Mar 07 Python
分析在Python中何种情况下需要使用断言
Apr 01 Python
使用PDB简单调试Python程序简明指南
Apr 25 Python
如何在Python中编写并发程序
Feb 27 Python
Python的collections模块中的OrderedDict有序字典
Jul 07 Python
Python选课系统开发程序
Sep 02 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
解决python多行注释引发缩进错误的问题
Aug 23 Python
Python如何实现在字符串里嵌入双引号或者单引号
Mar 02 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
Jun 17 Python
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
Apr 14 Python
Python实现简单的俄罗斯方块游戏
Sep 25 Python
Python面向对象程序设计示例小结
Jan 30 #Python
python实现浪漫的烟花秀
Jan 30 #Python
新年快乐! python实现绚烂的烟花绽放效果
Jan 30 #Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 #Python
解决Python selenium get页面很慢时的问题
Jan 30 #Python
对python实现模板生成脚本的方法详解
Jan 30 #Python
ActiveMQ:使用Python访问ActiveMQ的方法
Jan 30 #Python
You might like
php函数与传递参数实例分析
2014/11/15 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
Laravel如何自定义command命令浅析
2019/03/23 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
基于Jquery实现表格动态分页实现代码
2011/06/21 Javascript
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
python 获取文件列表(或是目录例表)
2009/03/25 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
python3.5仿微软计算器程序
2020/03/30 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
对python中Json与object转化的方法详解
2018/12/31 Python
python异步存储数据详解
2019/03/19 Python
Python常见数据类型转换操作示例
2019/05/08 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
澳大利亚领先的美容护肤品零售商之一:SkincareStore
2018/01/22 全球购物
信用社主任竞聘演讲稿
2014/05/23 职场文书
安全生产先进个人总结
2015/02/15 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
关于童年的读书笔记
2015/06/26 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
卫生主题班会
2015/08/14 职场文书
关于使用Redisson订阅数问题
2022/01/18 Redis
Java 使用类型为Object的变量指向任意类型的对象
2022/04/13 Java/Android
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技