使用python完成的一个烟花小程序
获取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 PIL import Image, ImageTk
from time import time, sleep
from random import choice, uniform, randint
from math import sin, cos, radians
GRAVITY = 0.05
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
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)
elif self.alive():
move_x = cos(radians(self.id*360/self.total))
self.cv.move(self.cid, self.vx + move_x, self.vy+GRAVITY*dt)
self.vy += GRAVITY*dt
elif self.cid is not None:
cv.delete(self.cid)
self.cid = None
def expand (self):
return self.age <= 1.2
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)
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
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
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)
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完成的一个烟花小程序 https://www.yuejiaxmz.com/news/view/434905
相关内容
Python实战:使用tkinter来编写一个激活码输入程序python毕设百货超市在线购物小程序小程序端程序+论文
【Python】实现一个个人理财助手小程序
使用python制作一个简单的任务管理器
Python操作Excel的Xlwings教程(八)——Excel使用VBA调用Python
推荐使用:Python驱动的个人助手
python毕设 酒店客房管理程序+论文
django基于Python的校园生活助手系统(程序+开题)
使用Python构建虚拟个人助手教程
python+flask计算机毕业设计个人时间管理APP(程序+开题+论文)