python实现烟花小程序

本文实例为大家分享了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

然后就可以运行了,在代码中有一个背景照片部分,路径可自行选择!我这里就不修改了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 新年快乐! python实现绚烂的烟花绽放效果

    做了一个Python的小项目.利用了一点python的可视化技巧,做出烟花绽放的效果,文章的灵感来自网络上一位大神. 一.编译环境 Pycharm 二.模块 1.tkinter:这个小项目的主角,是一个python图形模块.且Python3已经自带了该模块,不用另外安装.它有点像java中的swing图形模块(由众多组件集成,组件通过创建实例添加,组件通过坐标定位在窗口上). 2.PIL:Python Imaging Library,是Python平台的图像处理标准模块.在Python3也是自带

  • python实现浪漫的烟花秀

    无意中看到一段用Tkinter库写的放烟花的程序,就跟着跑了一遍. 设计理念:通过让画面上一个粒子分裂为X数量的粒子来模拟爆炸效果.粒子会发生"膨胀",意思是它们会以恒速移动且相互之间的角度相等.这样就能让我们以一个向外膨胀的圆圈形式模拟出烟花绽放的画面.经过一定时间后,粒子会进入"自由落体"阶段,也就是由于重力因素它们开始坠落到地面,仿若绽放后熄灭的烟花. 首先我们写一个粒子类,表示烟花事件中的每个粒子,包含大小,颜色,位置,速度等属性以及粒子经历的三个阶段的函数

  • python实现烟花小程序

    本文实例为大家分享了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 backgroun

  • python运行其他程序的实现方法

    python运行其他程序的实现方法              这里提供了两种实现方法,一.os.system()函数和 使用ShellExecute函数运行其他程序及实现代码,大家可以参考下, 一 使用os.system()函数运行其他程序 打开系统的记事本程序 >>>import os >>> os.system('notepad') 0 >>> os.system('notepad python.txt') 0 二 使用ShellExecute函数

  • go和python调用其它程序并得到程序输出

    在c语言中可以用system函数调用系统命令并得到输出,通过输出重定向也可以将程序执行的输出保存到文件以供使用,但用起来不是很方便.我这里介绍下用python和go语言的实现方式,可以将其它程序的输出直接保存成变量供程序使用. 下面的示例用的是ls命名,需要安装MinGW,并将"C:\MinGW\msys\1.0\bin"加入环境变量. 一.用python调用其它程序,并得到输出 示例代码: 复制代码 代码如下: import osvar = os.popen('ls -l').rea

  • python执行等待程序直到第二天零点的方法

    本文实例讲述了python执行等待程序直到第二天零点的方法.分享给大家供大家参考.具体分析如下: 如果需要通过python每天凌晨定时执行执行程序,可以使用下面的代码进行等待操作,无论什么时候执行系统都会等待到第二天凌晨才执行后面的程序. def waitToTomorrow(): """Wait to tommorow 00:00 am""" tomorrow = datetime.datetime.replace(datetime.datet

  • 使用Python写CUDA程序的方法

    使用Python写CUDA程序有两种方式: * Numba * PyCUDA numbapro现在已经不推荐使用了,功能被拆分并分别被集成到accelerate和Numba了. 例子 numba Numba通过及时编译机制(JIT)优化Python代码,Numba可以针对本机的硬件环境进行优化,同时支持CPU和GPU的优化,并且可以和Numpy集成,使Python代码可以在GPU上运行,只需在函数上方加上相关的指令标记, 如下所示: import numpy as np from timeit

  • python实现应用程序在右键菜单中添加打开方式功能

    最近项目组开发的一个小工具想要在右键菜单中添加打开方式,以有道云笔记为例进行了需求拆解和代码编写 1.需求拆解: 如何实现手动添加右键菜单的打开方式: Step1:打开注册表编辑器,Win+R->输入 "regedit" Step2:在HKEY_CLASSES_ROOT/*/shell (或者HKEY_LOCAL_MACHINE/SOFTWARE/Classes/*/shell ,两个目录是一样的) 添加一个key:YNote,然后在该项中新建项command,然后再编辑字符串,

  • Python实战小程序利用matplotlib模块画图代码分享

    Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序:画出y=x^3的散点图 样例代码如下: #coding=utf-8 import pylab as y #引入pylab模块 x = y.np.linspace(-10, 10, 100) #设置x横坐标范围和点数 y.plot(x, x*x*x,'or') #生成图像 ax = y.gca() a

  • 简单的python协同过滤程序实例代码

    本文研究的主要是python协同过滤程序的相关内容,具体介绍如下. 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看最近有什么好的电影推荐.在问的时候,都习惯于问跟自己口味差不多的朋友,这就是协同过滤的核心思想. 这个程序完全是为了应付大数据分析与计算的课程作业所写的一个小程序,先上程序,一共55行.不在意细节的话,55行的程序已经表现出了协同过滤的特性了.就是对每一个用户找4个最接近的用户,然后进行推荐,在选择

  • Python聊天室程序(基础版)

    本文实例为大家分享了Python聊天室程序的具体代码,供大家参考,具体内容如下 客户端代码: # Filename: socketClient.py import socket import sys import threading # Client GUI from tkinter import * import Pmw # Create a TCP/IP socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Con

  • python操作小程序云数据库实现简单的增删改查功能

    不止python,你可以利用任何语言那实现通过http请求来操作你自己的小程序云数据库了 背景 也是在最近吧,小程序更新了云开发 HTTP API 文档,提供了小程序外访问云开发资源的能力,使用 HTTP API 开发者可在已有服务器上访问云资源,实现与云开发的互通. 原本云数据库还是相对封闭的,只能通过自己的小程序或者云函数来进行访问,而现在,你只要调用官方提供的接口就能实现对云函数的增删改查了. 这里通过 python 作为演示来进行简单的测试,当然你也可以使用 java , php 等任何

随机推荐