O Python é uma linguagem versátil, permitindo desde processamento de dados até animações interativas. Neste post, vamos explorar um código que utiliza a biblioteca Tkinter para criar uma divertida explosão de estrelas no clique de um botão. O código se baseia na criação de múltiplas estrelas, que se espalham pelo espaço de um canvas, proporcionando uma experiência visual única e dinâmica.
Introdução ao Tkinter e ao Canvas
Tkinter é uma biblioteca padrão do Python para construção de interfaces gráficas (GUI). Aqui, a classe StarExplosion
é responsável pela configuração da interface e pela criação do efeito da explosão. Utilizamos o Canvas
, um elemento gráfico que permite o desenho de formas, imagens e animações em uma janela Tkinter. A interface possui um botão que, ao ser pressionado, inicia a explosão de estrelas.
Construindo Estrelas e Configurando a Explosão
Dentro da classe StarExplosion
, o método create_star
cria as estrelas como pequenos círculos coloridos. Para cada estrela, definimos uma posição central e um raio, além de escolher uma cor aleatória para garantir uma estética vibrante e dinâmica. A função explode
gera 50 estrelas no centro do canvas e chama o método animate
para iniciar a animação.
def create_star(self, x, y, r, color):
star = self.canvas.create_oval(x-r, y-r, x+r, y+r, fill=color, outline=color)
return {'id': star, 'x': x, 'y': y, 'r': r, 'vx': random.uniform(-2, 2), 'vy': random.uniform(-2, 2), 'color': color}
Animação das Estrelas com Movimentação Aleatória
Para a animação, o método animate
move cada estrela com uma velocidade aleatória (vx
, vy
) em diferentes direções. Quando uma estrela atinge a borda do canvas, ela é reposicionada no centro, mantendo o efeito visual por mais tempo. Isso permite um ciclo contínuo de movimento até que o botão seja pressionado novamente, criando uma nova explosão.
def animate(self):
for star in self.stars:
self.canvas.move(star['id'], star['vx'], star['vy'])
star['x'] += star['vx']
star['y'] += star['vy']
if star['x'] < 0 or star['x'] > 400 or star['y'] < 0 or star['y'] > 400:
self.canvas.delete(star['id'])
new_star = self.create_star(200, 200, 2, star['color'])
self.stars[self.stars.index(star)] = new_star
if self.stars:
self.root.after(10, self.animate)
Iniciando a Interface Gráfica
Para rodar o código, basta chamar a função Tk()
para iniciar a interface e mainloop()
para manter o loop da interface gráfica, onde os eventos de animação são atualizados a cada 10 milissegundos. Este projeto é ideal para quem quer explorar as possibilidades de criação de animações e interações dinâmicas com Python.
Código Completo
import tkinter as tk
from tkinter import Canvas
import random
import math
class StarExplosion:
def __init__(self, root):
self.root = root
self.root.title("Explosão de Estrelas")
self.canvas = Canvas(root, width=400, height=400, bg='black')
self.canvas.pack()
self.button = tk.Button(root, text="Explodir!", command=self.explode)
self.button.pack()
self.stars = []
def create_star(self, x, y, r, color):
star = self.canvas.create_oval(x-r, y-r, x+r, y+r, fill=color, outline=color)
return {'id': star, 'x': x, 'y': y, 'r': r, 'vx': random.uniform(-2, 2), 'vy': random.uniform(-2, 2), 'color': color}
def explode(self):
self.canvas.delete("all") # Limpa o canvas para uma nova explosão
x, y = 200, 200 # Centro do canvas
for _ in range(50): # Número de estrelas
color = f'#{random.randint(0, 0xFFFFFF):06x}' # Cor aleatória
self.stars.append(self.create_star(x, y, 2, color))
self.animate()
def animate(self):
for star in self.stars:
self.canvas.move(star['id'], star['vx'], star['vy'])
star['x'] += star['vx']
star['y'] += star['vy']
# Se a estrela sair do canvas, reposiciona no centro
if star['x'] < 0 or star['x'] > 400 or star['y'] < 0 or star['y'] > 400:
self.canvas.delete(star['id'])
new_star = self.create_star(200, 200, 2, star['color'])
self.stars[self.stars.index(star)] = new_star
if self.stars: # Continua a animação se ainda houver estrelas
self.root.after(10, self.animate)
if __name__ == "__main__":
root = tk.Tk()
app = StarExplosion(root)
root.mainloop()
0 Comentários