python创意小作品代码_python浪漫表白源码

python创意小作品代码_python浪漫表白源码这篇文章主要为大家详细介绍了python实现浪漫的烟花秀,具有一定的参考价值,感兴趣的小伙伴们可以参考一下无意中看到一段用Tkinter库写的放烟花的程序,就跟着跑了一遍。设计理念:通过让画面上一个粒子分裂为X数量的粒子来模拟爆炸效果。粒子会发生“膨胀”,意思是它们会以恒速移动且相互之间的角度相等。这样就能让我们以一个向外膨胀的圆圈形式模拟出烟花绽放的画面。经过一定时间后,粒子会进入“自由落体”阶…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

这篇文章主要为大家详细介绍了python实现浪漫的烟花秀,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

无意中看到一段用Tkinter库写的放烟花的程序,就跟着跑了一遍。

设计理念:通过让画面上一个粒子分裂为X数量的粒子来模拟爆炸效果。粒子会发生“膨胀”,意思是它们会以恒速移动且相互之间的角度相等。这样就能让我们以一个向外膨胀的圆圈形式模拟出烟花绽放的画面。经过一定时间后,粒子会进入“自由落体”阶段,也就是由于重力因素它们开始坠落到地面,仿若绽放后熄灭的烟花。

python创意小作品代码_python浪漫表白源码

首先我们写一个粒子类,表示烟花事件中的每个粒子,包含大小,颜色,位置,速度等属性以及粒子经历的三个阶段的函数,即:膨胀、坠落、消失。

”’

particles 类

粒子在空中随机生成随机,变成一个圈、下坠、消失

属性:

– id: 粒子的id

– x, y: 粒子的坐标

– vx, vy: 在坐标的变化速度

– total: 总数

– age: 粒子存在的时长

– color: 颜色

– cv: 画布

– lifespan: 最高存在时长

”’

class Particle:

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))

# 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

# 移除超过最高时长的粒子

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

接下来我们需要创建一列列表,每个子列表是一个烟花,其包含一列粒子,每个列表中的粒子有相同的x,y坐标、大小、颜色、初始速度。

源码如下:

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’]

”’

particles 类

粒子在空中随机生成随机,变成一个圈、下坠、消失

属性:

– id: 粒子的id

– x, y: 粒子的坐标

– vx, vy: 在坐标的变化速度

– total: 总数

– age: 粒子存在的时长

– color: 颜色

– cv: 画布

– lifespan: 最高存在时长

”’

class Particle:

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))

# 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

# 移除超过最高时长的粒子

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

”’

循环调用保持不停

”’

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 = Particle(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.8s内一直扩大

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):

“””退出程序、关闭窗口”””

global root

root.quit()

if __name__ == ‘__main__’:

root = tk.Tk()

cv = tk.Canvas(root, height=360, width=480)

# 选一个好看的背景会让效果更惊艳!

image = Image.open(“./image.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()

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’]

”’

particles 类

粒子在空中随机生成随机,变成一个圈、下坠、消失

属性:

– id: 粒子的id

– x, y: 粒子的坐标

– vx, vy: 在坐标的变化速度

– total: 总数

– age: 粒子存在的时长

– color: 颜色

– cv: 画布

– lifespan: 最高存在时长

”’

class Particle:

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))

# 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

# 移除超过最高时长的粒子

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

”’

循环调用保持不停

”’

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 = Particle(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.8s内一直扩大

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):

“””退出程序、关闭窗口”””

global root

root.quit()

if __name__ == ‘__main__’:

root = tk.Tk()

cv = tk.Canvas(root, height=360, width=480)

# 选一个好看的背景会让效果更惊艳!

image = Image.open(“./image.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()

效果图(背景请忽略哈哈):

python创意小作品代码_python浪漫表白源码

喜欢自己去跑一下

内容就以上怎么多,最后给大家推荐一个口碑不错的公众号【程序员学府】,这里有很多的老前辈学习技巧,学习心得,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员定时讲解Python技术,分享一些学习的方法和需要留意的小细节

python创意小作品代码_python浪漫表白源码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190466.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python表情代码_Python实现表情包的代码实例[通俗易懂]

    python表情代码_Python实现表情包的代码实例[通俗易懂]本文主要介绍了使用Python进行简单图像处理的方法以及Python自动生产表情包的实例,具有很好的参考价值,下面跟着小编一起来看下吧作为一个数据分析师,应该信奉一句话——“一图胜千言”。不过这里要说的并不是数据可视化,而是一款全民向的产品形态——表情包!!!!表情包不仅仅是一种符号,更是一种文化——是促进社交乃至社会发展的动力之一,就像懒。我们坚持认为,一张优秀的表情包,应该是一幅艺术品,是那忽…

    2022年10月29日
    0
  • tcp粘包分析_解决tcp粘包问题

    tcp粘包分析_解决tcp粘包问题原文源自:https://blog.csdn.net/zhangxinrun/article/details/6721495一.两个简单概念长连接与短连接:1.长连接   Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。2.短连接   Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种…

    2022年8月11日
    3
  • dpdk 性能_第二系列什么意思

    dpdk 性能_第二系列什么意思首先,DPDK和内核网络协议栈不是对等的概念。DPDK只是单纯的从驱动拿数据,然后组织成数据块给人用,跑在用户态。功能相当于linux的设备无关接口层,处于socket之下,驱动之上。只不过linux协议栈的这部分在核心态。你说的包处理器,很多时候是不用linux内核协议栈的,而是用专用包处理程序,类似于DPDK加上层应用处理。通常会有些硬件加速器,包处理效率更高些。缺点是一旦用不上某些功能

    2022年9月20日
    0
  • mybatis的二级缓存_mybatis的一级缓存

    mybatis的二级缓存_mybatis的一级缓存上次谈到了mybatis一级缓存实际上是SqlSession级别的缓存,多个SqlSession并不共享,针对这种情况,我们可以使用mybatis二级缓存来处理。1.mybatis二级缓存是什么mybatis二级缓存是mybatis的另一种缓存机制,区别于一级缓存,它是namespace级别,即一个mapper一个缓存,相互独立,互不影响。默认不开启,需要配置开启。同一namespace下的多个sqlSession可以共享缓存,大体结构如下图2.二级缓存生效的条件同一个namespa.

    2022年9月20日
    0
  • js中的prototype有什么作用?[通俗易懂]

    js中的prototype有什么作用?[通俗易懂]1、prototype对象是实现面向对象的一个重要机制。每个函数也是一个对象,它们对应的类就是function,每个函数对象都具有一个子对象prototype。Prototype表示了该函数的原型,prototype表示了一个类的属性的集合。当通过new来生成一个类的对象时,prototype对象的属性就会成为实例化对象的属性。下面以一个例子来介绍prototype的应用,代码如下:123456…

    2022年7月22日
    10
  • 成麻结账程序_成麻5元40满怎么算账

    成麻结账程序_成麻5元40满怎么算账1.0版预览地址:http://hudong.miaos.me/majiang/index.html2.0博客直通车:https://www.cnblogs.com/qinyulin/p/13566

    2022年8月2日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号