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 相关文章推荐
详解duck typing鸭子类型程序设计与Python的实现示例
Jun 03 Python
django项目运行因中文而乱码报错的几种情况解决
Nov 07 Python
python链接oracle数据库以及数据库的增删改查实例
Jan 30 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
python创建文件备份的脚本
Sep 11 Python
python3.6+django2.0+mysql搭建网站过程详解
Jul 24 Python
Python如何基于smtplib发不同格式的邮件
Dec 30 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 Python
Python图像处理库PIL的ImageDraw模块介绍详解
Feb 26 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
May 12 Python
Pyinstaller加密打包应用的示例代码
Jun 11 Python
Python max函数中key的用法及原理解析
Jun 26 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+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
分享一则javascript 调试技巧
2015/01/02 Javascript
JavaScript的原型继承详解
2015/02/15 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
基于Angular中ng-controller父子级嵌套的相关属性详解
2018/10/08 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
Postman如何实现参数化执行及断言处理
2020/07/28 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
vue iview 隐藏Table组件里的某一列操作
2020/11/13 Javascript
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
python3实现读取chrome浏览器cookie
2016/06/19 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
《猴子种树》教学反思
2014/02/14 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
无房证明范本
2014/09/17 职场文书
2014年计生协会工作总结
2014/11/21 职场文书
老员工辞职信范文
2015/05/12 职场文书
Python图片检索之以图搜图
2021/05/31 Python
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python