python烟花教程_干货教程:Python欠你一场浪漫烟花邂逅
是python呀2020-10-27 20:50:16烟花由中国古代人民较早发明,常用于盛大的典礼或表演中,也在除夕夜及元宵节中燃放用来烘托节日氛围。近年来随着环境污染的加剧,一些地区已经禁止燃放烟花了,那我们就用 Python 实现一场无污染的烟花秀。环境操作系统:WindowsPython 版本:3.6涉及模块:tkinter、PIL、time、random、math实现导入库: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烟花颜色:colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']定义烟花类:class fireworks:
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
# 烟花绽放 x 轴
self.x = x
# 烟花绽放 x 轴
self.y = y
self.initial_speed = explosion_speed
# 外放 x 轴速度
self.vx = vx
# 外放 y 轴速度
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 + 0.5 * dt)
self.vy += 0.5 * dt
# 过期移除
elif self.cid is not None:
cv.delete(self.cid)
self.cid = None
# 定义膨胀效果的时间帧
def expand(self):
return self.age <= 1.5
# 检查粒子是否仍在生命周期内
def alive(self):
return self.age <= self.lifespan燃放烟花:def ignite(cv):
t = time()
# 烟花列表
explode_points = []
wait_time = randint(10, 100)
# 爆炸的个数
numb_explode = randint(6, 10)
for point in range(numb_explode):
# 爆炸粒子列表
objects = []
# 爆炸 x 轴
x_cordi = randint(50, 550)
# 爆炸 y 轴
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 = fireworks(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
# 在 1.8 秒时间帧内保持更新
while total_time < 1.8:
# 让画面暂停 0.01s
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, ignite, cv)启动:if __name__ == "__main__":
root = http://tk.Tk()
# 绘制一个画布
cv = tk.Canvas(root, height=400, width=600)
# 背景图
image = Image.open("bg.jpg")
photo = ImageTk.PhotoImage(image)
# 在画板上绘制一张图片
cv.create_image(0, 0, image=photo, anchor='nw')
cv.pack()
root.protocol(close)
root.after(100, ignite, cv)
# 生成窗口
root.mainloop()最终效果,如图所示:
烟花由中国古代人民较早发明,常用于盛大的典礼或表演中,也在除夕夜及元宵节中燃放用来烘托节日氛围。近年来随着环境污染的加剧,一些地区已经禁止燃放烟花了,那我们就用 Python 实现一场无污染的烟花秀。
环境操作系统:Windows
Python 版本:3.6
涉及模块:tkinter、PIL、time、random、math
实现
导入库:
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
烟花颜色:
colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']
定义烟花类:
class fireworks:
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
# 烟花绽放 x 轴
self.x = x
# 烟花绽放 x 轴
self.y = y
self.initial_speed = explosion_speed
# 外放 x 轴速度
self.vx = vx
# 外放 y 轴速度
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 + 0.5 * dt)
self.vy += 0.5 * dt
# 过期移除
elif self.cid is not None:
cv.delete(self.cid)
self.cid = None
# 定义膨胀效果的时间帧
def expand(self):
return self.age <= 1.5
# 检查粒子是否仍在生命周期内
def alive(self):
return self.age <= self.lifespan
燃放烟花:
def ignite(cv):
t = time()
# 烟花列表
explode_points = []
wait_time = randint(10, 100)
# 爆炸的个数
numb_explode = randint(6, 10)
for point in range(numb_explode):
# 爆炸粒子列表
objects = []
# 爆炸 x 轴
x_cordi = randint(50, 550)
# 爆炸 y 轴
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 = fireworks(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
# 在 1.8 秒时间帧内保持更新
while total_time < 1.8:
# 让画面暂停 0.01s
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, ignite, cv)
启动:
if __name__ == "__main__":
root = tk.Tk()
# 绘制一个画布
cv = tk.Canvas(root, height=400, width=600)
# 背景图
image = Image.open("bg.jpg")
photo = ImageTk.PhotoImage(image)
# 在画板上绘制一张图片
cv.create_image(0, 0, image=photo, anchor='nw')
cv.pack()
root.protocol(close)
root.after(100, ignite, cv)
# 生成窗口
root.mainloop()
最终效果,如图所示:
python烟花教程_干货教程:Python欠你一场浪漫烟花邂逅相关推荐
- apicloud菜鸟教程_干货教程 | APICloud新手学习心得分享
最近很多爱学习的开发者,在后台给柚子君留言询问:如何在APICloud平台创建app?如何添加模块?自定义loader编译好之后在studio里面怎么同步等问题. 柚子君就借此机会给大家分享一个对 j ...
- python del函数_干货:Python的内存管理办法
了解内存管理可以帮助您编写高效的Python代码.可能无法控制内存分配,但是您可以优化程序来更好地分配内存. 在python中,整个对象存储在内存中,对象可以是整数.字符串或列表,以及指向对象的变量. ...
- python 数据库 实战_干货!python与MySQL数据库的交互实战
鼠年大吉 HAPPY 2020'S NEW YEAR 1 安装pymysql库 如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个 库的安装很简单,直接使用pip i ...
- python大神教程_大神python教程415集全套,拿走不谢
大神的教程 由北京尚学堂高淇老师亲自录制,2019Python自学教程全新升级为<Python+数据分析+机器学习>能力逐级提升,打造技能更全面的全栈工程师. Python作为一种编程语言 ...
- python是什么编程教程-编程python是什么_谁的Python教程最好?
谁的Python教程最好? 建议你可以看看这里的<Python基础教程>和<Python学习手册>应该适合你的. 希望对你有用. 记得采纳呀~ Python中的9个代码小实例! ...
- 微软发布的python教程_微软发布Python 教程《Develop with Python on Windows》
微软近日上线了一套 Python 教程<Develop with Python on Windows>,文档内容包括设置 Python 开发环境.在 Windows 与 WSL 子系统中安 ...
- python电脑下载教程_苹果电脑python下载安装教程
这个问题我遇到过的,你把现在装的python卸了,装个32位的python就可以了,32位安装包官网上有. . 工具/原料:python.win7电脑一台方法/步骤:1.打开win7电脑,从百度搜索p ...
- 怎么安装python的包_『本地python包怎么通过pyenv安装』python包本地安装教程
python怎么安装第三方类库 pip 大多数库都可以通pip安装,安装方法为,令行窗口输入 pip install libname libname名 某些库通过pip安装不了,可能是因为没有打包上传 ...
- python web.py教程_如何用Python汇款:Web3.py教程
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python开发人员对于以太坊和区块链库的技术练习. 警告:下面的教程包含这些元素:显式加密.点对点金融服 ...
最新文章
- 2018.5.12说说反射的用途及实现------要再花费时间加强理解
- php获取p标签的值,js使用html()或text()方法获取设置p标签的显示的值
- kotlin学习之伴生对象(十五)
- Android开发之可以在临界点左右滑动的ViewPager
- linux ftp 工作过程,linux中ftp的安装过程记录[运维篇]
- 数据结构之树【完善中】
- 2019最后一个月Python继续霸榜,想上车?看这份书单
- 2019.1.5 DOM
- 2009年2月26日经济报道:奥巴马2010年3.5万亿美元预算。
- 2018年单招理科考计算机吗,2018高职单招考试难吗 单招考试的内容
- 2021年中国研究生数学建模竞赛B题参考思路
- 链表、数组、跳表时间复杂度
- c# 微信公众号开发之自定义菜单栏
- 【python 题练】
- Linux Centos7 搭建简易堡垒机安装jailkit实现chroot
- java学习第17天,p183-p190(12/21)
- 华为的价值主张带给施工企业数字化转型的价值思考
- 水务新、老营收系统大PK
- 扫二维码访问网站、网页
- Linux操作系统下如何查看SQLite的数据库文件
热门文章
- matlab如何在一个区域取电,基于MATLAB带钢卷取电液伺服控制系统的分析
- 微信小程序|使用小程序制作一个马赛克处理工具
- python可以开发app吗-惊呆!那些顶级App居然是用Python开发的
- Android Studio Chipmunk | 2021.2.1 Patch 2(2022 年 8 月)
- 百度地图 由起点和终点 获取中间路线的坐标集
- 一份MCS51指令表
- 游戏服务器多钱一个月呢?
- WINPE WIN10 测试i9-9900k+2080TI\i9-9980XE+P5000\i7-8086k+titanX\E5-2678+128G跑分
- python简单游戏程序-python基础练习之几个简单的游戏
- 对“端到端”原则的理解