2021 Fogos de artifício - Feliz Ano Novo - Python

índice

Prefácio

1. Introdução ao conhecimento

2. Código completo

Três referências


Prefácio

Ontem, o WeChat atualizou a versão, adicionando a expressão de fogos de artifício. Alguns alunos do XM fizeram sugestões para usar a programação python para obter o efeito de fogos de artifício. Como o Ano Novo Chinês de 2021 está chegando, desejo a todos um feliz Ano Novo Chinês e desejo prosperidade à nossa pátria mãe!

Produção de GIFs: https://en.softonic.com/best/free-to-play-games/?utm_source=wakeup

 

1. Introdução ao conhecimento

1. Tkinter: O protagonista deste pequeno projeto é um módulo gráfico python. E o Python3 já vem com este módulo, então não há necessidade de instalá-lo separadamente. É um pouco como o módulo de gráficos swing em java (integrado por muitos componentes, os componentes são adicionados criando instâncias e os componentes são posicionados na janela por coordenadas).

2. PIL: Python Imaging Library, um módulo padrão para processamento de imagens na plataforma Python. Ele também vem com o Python3 e é usado neste projeto para importar imagens de fundo.

3.tempo: Acredito que este módulo não será desconhecido para todos, importe-o para controlar o tempo de floração, queda e desaparecimento dos fogos de artifício.

4.random: módulo de número aleatório, usado para gerar pontos de coordenadas aleatórias de fogos de artifício, velocidade de florescência aleatória, tempo de desaparecimento aleatório.

5.math: Todos devem estar familiarizados com este módulo.O objetivo de sua importação é espalhar as partículas dos fogos de artifício que florescem em um determinado ângulo.

2. Código completo

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""

'''
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 tkinter import messagebox
# from tkinter import PhotoImage
from PIL import Image, ImageTk ,ImageDraw
from time import time, sleep
from random import choice, uniform, randint
from math import sin, cos, radians
from PIL import ImageFont

# gravity, act as our constant g, you can experiment by changing it
GRAVITY = 0.05
# list of color, can choose randomly or use as a queue (FIFO)
colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 
          '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

        # particle expansions
        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)

        # falling down in projectile motion
        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

        # remove article if it is over the lifespan
        elif self.cid is not None:
            cv.delete(self.cid)
            self.cid = None

    # define time frame for expansion
    def expand(self):
        return self.age <= 1.2

    # check if particle is still alive in lifespan
    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)
    # create list of list of all particles in all simultaneous explosion
    # 创建一个所有粒子同时扩大的二维列表
    for point in range(numb_explode):
        objects = []
        x_cordi = randint(50, 1250)
        y_cordi = randint(50, 500)
#        烟花降落的速度
        speed = uniform(1, 4)
        size = uniform(0.5, 3)
        color = choice(colors)
        explosion_speed = uniform(1.5, 6)
        total_particles = randint(20, 100)
        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
    # keeps undate within a timeframe of 1.8 second
    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
    # recursive call to continue adding new explosion on canvas
    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.Toplevel()
    root.title("2021新年快乐呀^_^")
    
    cv = tk.Canvas(root, height=854, width=1280)
    
    
    # use a nice background image
#    image = Image.open("image1.jpg")
#    photo = ImageTk.PhotoImage(image)
#    
    #设置字体,如果没有,也可以不设置
    font = ImageFont.truetype("C:\\Windows\\Fonts\\simsun.ttc",60)    #现在是宋体
    #打开底版图片
    image=Image.open("image1.jpg")
    # 在图片上添加文字 1
    draw = ImageDraw.Draw(image)
    draw.text((400, 50),"2021要加油哦",fill = "yellow",font=font)
#    draw = ImageDraw.Draw(image)
    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()
    

Três referências

 

  1. Link de referência do código: https://github.com/tuangauss/DataScienceProjects/blob/master/Python/fireworks.py
  2. Adicione texto à imagem python: https://blog.csdn.net/dyyay521/article/details/102546637
  3. 【解决 问题】 Erro Python : imagem "pyimage1" não existe: https://blog.csdn.net/weixin_44436677/article/details/105498762

Acho que você gosta

Origin blog.csdn.net/weixin_43442778/article/details/113001590
Recomendado
Clasificación