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 元类使用说明
Dec 18 Python
python统计一个文本中重复行数的方法
Nov 19 Python
Python的SQLAlchemy框架使用入门
Apr 29 Python
利用 Monkey 命令操作屏幕快速滑动
Dec 07 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
基于python 处理中文路径的终极解决方法
Apr 12 Python
对python中Json与object转化的方法详解
Dec 31 Python
使用 Python 写一个简易的抽奖程序
Dec 08 Python
Python+OpenCV实现图像的全景拼接
Mar 05 Python
解决Django transaction进行事务管理踩过的坑
Apr 24 Python
Python手拉手教你爬取贝壳房源数据的实战教程
May 21 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
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
PHP用mysql数据库存储session的代码
2010/03/05 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
2014/10/29 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
JavaScript 撑出页面文字换行
2009/06/15 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
jquery 简单应用示例总结
2013/08/09 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
javascript基本类型详解
2014/11/28 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
Python中字符串与编码示例代码
2019/05/20 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
pytorch构建多模型实例
2020/01/15 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
python SOCKET编程基础入门
2021/02/27 Python
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
Etam德国:内衣精品店
2019/08/25 全球购物
介绍一下linux文件系统分配策略
2013/02/25 面试题
解释下面关于J2EE的名词
2013/11/15 面试题
新闻专业个人自我评价
2013/09/21 职场文书
电气工程师岗位职责
2014/01/01 职场文书
小组口号大全
2014/06/09 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书