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之import机制详解
Jul 03 Python
Python中的random()方法的使用介绍
May 15 Python
python清除字符串里非数字字符的方法
Jul 02 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
Feb 18 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
May 18 Python
python实现知乎高颜值图片爬取
Aug 12 Python
Python中顺序表原理与实现方法详解
Dec 03 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
python多线程使用方法实例详解
Dec 30 Python
python使用多线程查询数据库的实现示例
Aug 17 Python
Pandas自定义选项option设置
Jul 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
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
PHP判断数据库中的记录是否存在的方法
2014/11/14 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
JS 动态加载脚本的4种方法
2009/05/05 Javascript
this和执行上下文实现代码
2010/07/01 Javascript
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
Jquery实现自定义窗口随意的拖拽
2014/03/12 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
js读取本地文件的实例
2017/12/22 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
Vue指令之 v-cloak、v-text、v-html实例详解
2019/08/08 Javascript
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
判断网页编码的方法python版
2016/08/12 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
python批量爬取下载抖音视频
2019/06/17 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
如何使用python传入不确定个数参数
2020/02/18 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
CSS3实现任意图片lowpoly动画效果实例
2017/05/11 HTML / CSS
css3的transform中scale缩放详解
2014/12/08 HTML / CSS
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
全球性的女装店:storets
2019/06/12 全球购物
优秀高中生事迹材料
2014/02/11 职场文书
初三开学计划书
2014/04/27 职场文书
给校长的建议书400字
2014/05/15 职场文书
超市创意活动方案
2014/08/15 职场文书
给领导敬酒词
2015/08/12 职场文书
吉利入股戴姆勒后smart“长大了”
2022/04/21 数码科技