用python一起来看流星雨



源代码如下(遇上篇烟花代码几乎一样,参数值稍微不一样):
# -*- coding: utf-8 -*-
# Nola 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 # # 初始化tkinter 创建根部件 必须在创建其他部件之前创建 且只有一个
# root = tk.Tk()
# # Label部件
# w = tk.Label(root, text="Hello Tkinter!")
# # pack告诉tkinter调整窗口大小适应所用的小部件
# w.pack()
# root.mainloop()
# 模拟重力
GRAVITY = 0.05
colors = ['red', 'blue', 'pink', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue'] class Part(object):
"""
particles 类
粒子在空中随机生成,变成一个圈,下坠,消失
"""
def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2, **kwargs):
"""
:param cv: 画布
:param idx: 粒子的id
:param total: 总数
:param explosion_speed: 粒子初始速度
:param x: 粒子的横坐标
:param y: 粒子的纵坐标
:param vx: 粒子在x轴上的变化速度
:param vy: 粒子在y轴上的变化速度
:param size: 大小
:param color: 颜色
:param lifespan: 最高存在时长
:param 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):
"""
粒子运动函数,膨胀
:param dt:
:return:
"""
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.vy = move_y / (float(dt)*1000)
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:
self.cv.delete(self.cid)
self.cid = None def alive(self):
"""
检查粒子是否在最高存在时长内
:return: bool
"""
return self.age <= 1.2 def expand(self):
"""
定义膨胀效果时间帧
:return: bool
"""
return self.age <= self.lifespan def simulate(cv):
"""
循环调用保持不停
:param cv: 画布
:return:
"""
numb_explode = randint(6, 10)
wait_time = randint(10, 100)
explode_points = []
t = time()
# 为所有模拟烟花绽放的全部粒子创建一个列表
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(1, 3) # 随机生成一个0.5-3之间的实数
color = choice(colors)
explosion_speed = uniform(0.2, 1)
total_particals = randint(5, 50)
for i in range(1, total_particals):
r = Part(cv, idx=1, total=total_particals, 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) # 设置每个粒子没0.01秒更新状态 生命周期1.8秒 1.6秒存活(1.2秒绽放,0.4秒坠落,0.2秒移除)
total_time = .0
# 在1.8秒时间帧内保持更新
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):
"""
退出程序,关闭窗口
:param ignore:
:return:
"""
global root
root.quit() if __name__ == '__main__':
# 初始化tkinter 创建根部件
root = tk.Tk() cv = tk.Canvas(root, height=400, width=600)
# 绘制一个黑色背景
cv.create_rectangle(0, 0, 600, 600, fill='black')
# 使用背景图片
# image = Image.open('./image.png')
# photo = ImageTk.PhotoImage(image)
# cv.create_image(0, 0, image=photo, anchor='nw')
cv.pack() root.protocol('WM_DELETE_WINDOW', close)
# 1秒后开始条约simulate()
root.after(100, simulate, cv)
root.mainloop()
用python一起来看流星雨的更多相关文章
- 基于python2+selenium3+pytest4的UI自动化框架
环境:Python2.7.10, selenium3.141.0, pytest4.6.6, pytest-html1.22.0, Windows-7-6.1.7601-SP1 特点:- 二次封装了s ...
- 夺命雷公狗---DEDECMS----16dedecms取出首页今日更新
我们这次就要来取出我们的电影和电视剧以及综艺节目: 我们首先在我们受页面的模版文件中获取电影和电视剧的标签: 我们发现这里有一大堆,我只留一个即可: 然后我们到后台更新下首页的模版,看下是否只有一个模 ...
- 夺命雷公狗---DEDECMS----13dedecms首页的完成
我们的dedecms搭建起来后直接复制templets的目录复制一份,如下所示: 然后进入templets目录里面,然后再将default里面的东西都给干掉,然后将我们预先准备好的首页放进来,代码如下 ...
- VBA 开发学习--基础语法
MsgBox "开始学习VBA" '提示框 Dim str As String '声明str变量是string类型 Let str = "一起来看流星雨" '给 ...
- 洛谷 P2895 [USACO08FEB]流星雨Meteor Shower 解题报告
一起来看流星雨吧(话说我还没看到过流星雨呢) 题目 Problem 小A则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽,届时将会对它撞到的一 ...
- canvas绘制流星雨特效
源码: <!DOCTYPE html><html> <head> <meta charset="utf-8"> <meta n ...
- 福州11911.562(薇)xiaojie:福州哪里有xiaomei
福州哪里有小姐服务大保健[微信:11911.562倩儿小妹[福州叫小姐服务√o服务微信:11911.562倩儿小妹[福州叫小姐服务][十微信:11911.562倩儿小妹][福州叫小姐包夜服务][十微信 ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
随机推荐
- (转载)mybatis中传入参数是list或map
原文地址:http://blog.csdn.net/aya19880214/article/details/41961235 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集 ...
- Spring 工具包
Spring 工具包: spring-core-.RELEASE.jar!\org\springframework\util
- docker 启动失败
今天本来想抽空弄一下openshift,新装了个centos结果docker起不来. 报错内容: [root@master docker]# systemctl status docker.servi ...
- SQLite的时间差判断--删除N天前的数据的两种写法
比如我有个用SQLite Studio创建的Sqlite3类型数据库,里面有个表名为StatisticsData的表结构是 : -- 表:StatisticsData CREATE TABLE &qu ...
- Python工资高还是Java?
说起来,随着人工智能和大数据逐渐进入人们的眼中,越来越多的人看到互联网未来大好发展趋势,而想要学习一门技术来进入其中,以期分一杯羹.但是,作为人工智能和大数据的重要编程语言,Python和Java,该 ...
- Zeu.js
一个生成各种 GIF 动画的 JavaScript 类库,非常适合用于让你的数据展示变得更加地生动.使用起来也非常简单,有数据展示需求的同学可以尝试一下.https://shzlw.github.io ...
- Linux configure,make,make install
https://www.cnblogs.com/tinywan/p/7230039.html https://www.sohu.com/a/191735643_505857 https://blog. ...
- nginx配置优化 第二章
一:常用功能优化: 1:网络连接的优化: 只能在events模块设置,用于防止在同一一个时刻只有一个请求的情况下,出现多个睡眠进程会被唤醒但只能有一个进程可获得请求的尴尬,如果不优化,在多进程的ngi ...
- Docker Kubernetes 高可用架构设计
Docker Kubernetes 高可用架构设计 官方方案:保证master端不发生单点故障. 官方使用一台Load Balancer负载均衡代理3台master端,终端与etcd与work Nod ...
- GDB in Action
GDB in Action 入门 编译 gcc -g -O0 -o word2vec.c word2vec -g 选项:要求 gcc 编译器保留调试符号信息. -O0 选项表示不优化,从 O1 ~ O ...