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中字符串的处理技巧分享
Sep 17 Python
一些常用的Python爬虫技巧汇总
Sep 28 Python
神经网络python源码分享
Dec 15 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 Python
python @property的用法及含义全面解析
Feb 01 Python
PyCharm代码提示忽略大小写设置方法
Oct 28 Python
对python 调用类属性的方法详解
Jul 02 Python
Python绘制股票移动均线的实例
Aug 24 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
python等待10秒执行下一命令的方法
Jul 19 Python
python实现暗通道去雾算法的示例
Sep 27 Python
用python批量下载apk
Dec 29 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发送邮件类代码附详细说明
2008/07/10 PHP
php Rename 更改文件、文件夹名称
2011/05/24 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
作为PHP程序员应该了解MongoDB的五件事
2013/06/03 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
jQuery插件Validation表单验证详解
2018/05/26 jQuery
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
详解Python可视化神器Yellowbrick使用
2019/11/11 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
Python识别html主要文本框过程解析
2020/02/18 Python
python使用建议与技巧分享(一)
2020/08/17 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
在C中是否有模拟继承等面向对象程序设计特性的好方法
2012/05/22 面试题
幼儿园教师获奖感言
2014/03/11 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
党员民主评议总结
2014/10/20 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
青年志愿者服务活动总结
2015/05/06 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python