2021 Fireworks-Happy New Year-Python

Tabla de contenido

Prefacio

1. Introducción al conocimiento

2. Código completo

Tres referencias


Prefacio

Ayer, WeChat actualizó la versión agregando la expresión de fuegos artificiales Algunos estudiantes de XM sugirieron usar la programación en Python para lograr el efecto de fuegos artificiales. Ahora que se acerca el Año Nuevo Chino 2021, ¡les deseo a todos un feliz Año Nuevo Chino y les deseo a nuestra patria prosperidad!

Producción de GIF: https://en.softonic.com/best/free-to-play-games/?utm_source=wakeup

 

1. Introducción al conocimiento

1. Tkinter: El protagonista de este pequeño proyecto es un módulo de gráficos en Python. Y Python3 ya viene con este módulo, por lo que no es necesario instalarlo por separado. Es un poco como el módulo de gráficos swing en Java (integrado por muchos componentes, los componentes se agregan creando instancias y los componentes se colocan en la ventana por coordenadas).

2. PIL: Python Imaging Library, un módulo estándar para el procesamiento de imágenes en la plataforma Python. También viene con Python3 y se usa en este proyecto para importar imágenes de fondo.

3.tiempo: Creo que este módulo no será desconocido para todos, impórtelo para controlar el tiempo de floración, caída y desaparición de los fuegos artificiales.

4. aleatorio: módulo de número aleatorio, utilizado para generar puntos de coordenadas aleatorios de fuegos artificiales, velocidad de floración aleatoria, tiempo de desaparición aleatoria.

5.math: Todo el mundo debería estar familiarizado con este módulo, el propósito de importarlo es esparcir las partículas de los fuegos artificiales que florecen en un cierto á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()
    

Tres referencias

 

  1. Enlace de referencia de código: https://github.com/tuangauss/DataScienceProjects/blob/master/Python/fireworks.py
  2. Agregue texto a la imagen de Python: https://blog.csdn.net/dyyay521/article/details/102546637
  3. 【解决 问题】 Python-Error: la imagen "pyimage1" no existe: https://blog.csdn.net/weixin_44436677/article/details/105498762

Supongo que te gusta

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