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 相关文章推荐
PyMongo安装使用笔记
Apr 27 Python
python中range()与xrange()用法分析
Sep 21 Python
Python将多份excel表格整理成一份表格
Jan 03 Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
对python生成业务报表的实例详解
Feb 03 Python
python 读取修改pcap包的例子
Jul 23 Python
基于Python中的yield表达式介绍
Nov 19 Python
python内置模块collections知识点总结
Dec 19 Python
通过实例解析Python return运行原理
Mar 04 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
python实现学生信息管理系统源码
Feb 22 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
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
2009/10/31 PHP
php使用pdo连接并查询sql数据库的方法
2014/12/24 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
PHP输出Excel PHPExcel的方法
2018/07/26 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
JS类库Bindows1.3中的内存释放方式分析
2007/03/08 Javascript
JavaScript入门教程 Cookies
2009/01/31 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
基于vue-simplemde实现图片拖拽、粘贴功能
2018/04/12 Javascript
jQuery中的类名选择器(.class)用法简单示例
2018/05/14 jQuery
在Vue-cli里应用Vuex的state和mutations方法
2018/09/16 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
JS实现可以用键盘方向键控制的动画
2020/12/11 Javascript
python实现excel读写数据
2021/03/02 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
如何用Python 加密文件
2020/09/10 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
英国马莎百货官网:Marks & Spencer
2016/07/29 全球购物
承诺书范文
2014/06/03 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
软件测试专业推荐信
2014/09/18 职场文书
遗愿清单观后感
2015/06/09 职场文书
运动会通讯稿100字
2015/07/20 职场文书
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js