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实现从网络下载文件并获得文件大小及类型的方法
Apr 28 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
Nov 19 Python
Python如何通过subprocess调用adb命令详解
Aug 27 Python
PyQt5主窗口动态加载Widget实例代码
Feb 07 Python
python绘制已知点的坐标的直线实例
Jul 04 Python
在 Jupyter 中重新导入特定的 Python 文件(场景分析)
Oct 27 Python
Django继承自带user表并重写的例子
Nov 18 Python
python画蝴蝶曲线图的实例
Nov 21 Python
python离线安装外部依赖包的实现
Feb 13 Python
Pycharm添加虚拟解释器报错问题解决方案
Oct 13 Python
Python还能这么玩之用Python修改了班花的开机密码
Jun 04 Python
Python机器学习应用之工业蒸汽数据分析篇详解
Jan 18 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的ob_start();控制您的浏览器cache!
2007/02/14 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
php实现的简易扫雷游戏实例
2015/07/09 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
2016/11/16 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
bootstrap-table组合表头的实现方法
2017/09/07 Javascript
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
五分钟搞懂Vuex实用知识(小结)
2019/08/12 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
Python读写文件基础知识点
2019/06/10 Python
python TCP包注入方式
2020/05/05 Python
PyQt5实现登录页面
2020/05/30 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
信息与计算科学专业推荐信
2014/02/23 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
辞职信如何写
2015/02/27 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python