python代码画动态烟花复制,python绘制满屏玫瑰盛开-程序员宅基地

技术标签: python  人工智能  开发语言  

大家好,小编来为大家解答以下问题,python代码画动态烟花,Word文档,html烟花代码大全可复制免费,今天让我们一起来看看吧!

Source code download: 本文相关源码

大家好,本文将围绕python画烟花绽放出字展开说明,python代码画动态烟花是一个很多人都想弄明白的事情,想搞清楚用python画烟花代码需要先了解以下几个事情。

做了一个Python的小项目python引用turtle画蝴蝶。利用了一点python的可视化技巧,做出烟花绽放的效果,文章的灵感来自网络上一位大神高中信息技术python实验

一.编译环境

Pycharm

二.模块

1.tkinter:这个小项目的主角,是一个python图形模块。且Python3已经自带了该模块,不用另外安装。它有点像java中的swing图形模块(由众多组件集成,组件通过创建实例添加,组件通过坐标定位在窗口上)。

2.PIL:Python Imaging Library,是Python平台的图像处理标准模块。在Python3也是自带的,在这个项目中用于背景图片的导入。

3.time:相信这个模块大家都不会陌生,导入它用来控制烟花的绽放,坠落及消失时间。

4.random:随机数模块,用于生成烟花随机坐标点,随机绽放速度,随机消失时间。

5.math:这个模块大家应该也很熟悉了,导入它的目的是使烟花绽放的粒子以一定角度散开。

三.效果

blank.gif

项目最终实现的效果就跟上面一样了。

四.代码

以下是我学习(copy)了那位大神的代码,再添加了一些浅显的注解。

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.5

#listof colors,can choose randomly or use as queue(FIFO

colors=['red','blue','yellow','white','green','orange','purple','seagreen','indigo','cornflowerblue']

'''

create a class for particles粒子

particles are emitted almost randomly on the sky,

forming around(组成一个圈) of circle(a star)before falling and getting removed from canvas

Attributes(属性):

id:每个特定烟花的标识符

x,y:烟花的绽放坐标

vx,vy:烟花的绽放速度

total:一颗烟花里的星星总数

age:一颗星星会在画布上停留多久

color:自我移植

cv:画布

lifespan:星星在画布上停留的最后时间

'''

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#烟花的绽放x轴

self.y=y#烟花的绽放x轴

self.initial_speed=explosion_speed#初速度

self.vx=vx#外放x轴速度

self.vy=vy#外放y轴速度

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)#create_oval()创建一个椭圆,参数为左上x,左上y,右下x,右下y,填满的颜色,该函数返回一个id

self.lifespan=lifespan#应该停留时间

def update(self,dt):#更新数据,已停留时间增加

self.age+=dt

#粒子膨胀

if self.alive() and self.expand():#如果停留时间(2s)足够&&膨胀时间(1.2s)足够

move_x=cos(radians(self.id*360/self.total))*self.initial_speed#粒子的x轴继续膨胀

move_y=sin(radians(self.id*360/self.total))*self.initial_speed#粒子的y轴继续膨胀

self.cv.move(self.cid, move_x, move_y)#根据id把画布上的粒子移动x和y个距离

self.vx=move_x/(float(dt)*1000)

#以自由落体坠落

elif self.alive():#如果只是停留时间足够,说明膨胀到最大了,应该准备下坠

move_x=cos(radians(self.id*360/self.total))#x轴继续膨胀

self.cv.move(self.cid,self.vx+move_x,self.vy+GRAVITY*dt)#而y轴按照重力因素做落体运动,但实际上这个重力是v而不是a

self.vy+=GRAVITY*dt#更新一下y轴

elif self.cid is not None:#如果粒子的生命周期已过,就将其移除

cv.delete(self.cid)#删除该粒子对象

self.cid=None

#定义膨胀效果的时间帧

def expand(self):

return self.age<=1.2#膨胀时间小于1.2s

#检查粒子是否仍在生命周期内

def alive(self):#已停留时间是不是比应该停留时间短

return self.age<=self.lifespan

'''

烟花模拟回路:

递归调用来在画布上重复发出新的烟火

通过每个“部件”对象内部的更新协议,每次调用时都要在画布上创建并绘制列表(星列表,每个星列表成员都是粒子列表)来重复地在画布上发出新的焰火

'''

#生成新的一轮爆炸

def simulate(cv):

t=time()#time()函数返回自1970年后经过的浮点秒数,精确到小数点后6位

explode_points=[]#爆炸点列表--烟花列表

wait_time=randint(10,100)#随机生成一个int n,10<=n<=100

numb_explode=randint(6,10)#爆炸的个数是6~10

#为所有模拟烟花绽放的全部例子创建一列列表

for point in range(numb_explode):#遍历爆炸的个数

objects=[]#这是每个点的爆炸粒子列表

x_cordi=randint(50,550)#每个点的爆炸x轴

y_cordi=randint(50,150)#爆炸y轴

speed=uniform(0.5,1.5)#随机生成一个float speed,0.5<=speed<1.5

size=uniform(0.5,3)#随机生成一个float size,0.5<=size<3

color=choice(colors)#choice()是python内置函数,随机返回元组,列表,或字符串的一个成员

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#先把时间置0

#在1.8秒时间帧内保持更新

while total_time<1.8:

sleep(0.01)#让画面暂停0.01s

tnew=time()#刷新时间

t,dt=tnew,tnew-t#时间等于新时间,与上次时间间隔为tnew-t

for point in explode_points:#遍历烟花列表

for item in point:#遍历烟花里的粒子列表

item.update(dt)#更新时间

cv.update()#刷新页面

total_time+=dt#为上面的while循环增加时间

root.after(wait_time,simulate,cv)#将组件置于其他组件之后,就是放在最顶层,覆盖下面的,这里递归第哦啊用了自己,形成新的一轮爆炸

def close(*ignore):

#打开模拟循环并关闭窗口

global root

root.quit()

if __name__=="__main__":

root=tk.Tk()

cv=tk.Canvas(root,height=600,width=700)#绘制一个画布

#绘制一个黑色背景

#cv.create_rectangle(0,0,600,600,fill="black")

#use a nice background image

image=Image.open("L:\PyCharm Community Edition 2018.2.2\Python_program\image.jpg")

photo=ImageTk.PhotoImage(image)

cv.create_image(0,0,image=photo,anchor='nw')#在画板上绘制一张图片

cv.pack()#把cv添加进去

root.protocol("WM_DELETE_WINDOW",close)

#在0.1s后才开始调用stimulate()

root.after(100,simulate,cv)#调用stimulate生成一轮烟花绽放效果

root.mainloop()#执行root,生成窗口

#让我更加明白了python的一切皆对象

五.结尾

这篇博客暂时就这样,如果有机会会重新做一遍,不过最大的可能就是遥遥无期了。先打算对项目做如下修改:

1.增加鼠标交互功能,用户鼠标点击位置额外生成烟花绽放;

2.增加文字绘制功能,在背景图中隐藏有字样,烟花绽放后落于字样中的粒子不消失,而是定格在窗口中。

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

时间: 2019-01-28

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/nbhkk/article/details/137150742

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签