import tkinter as tk
import random
from math import sin, cos, pi
import time
class AnimatedWindow:
def __init__(self):
self.root = tk.Tk()
self.root.title("动态窗口特效")
self.root.geometry("800x600")
# 创建画布
self.canvas = tk.Canvas(self.root, width=800, height=600, bg='black')
self.canvas.pack(fill='both', expand=True)
# 存储粒子
self.particles = []
# 创建初始粒子
for _ in range(50):
x = random.randint(0, 800)
y = random.randint(0, 600)
dx = random.uniform(-2, 2)
dy = random.uniform(-2, 2)
size = random.randint(2, 5)
color = '#{:02x}{:02x}{:02x}'.format(
random.randint(100, 255),
random.randint(100, 255),
random.randint(100, 255)
)
particle = self.canvas.create_oval(
x, y, x+size, y+size,
fill=color, outline=color
)
self.particles.append({
'id': particle,
'x': x, 'y': y,
'dx': dx, 'dy': dy,
'size': size
})
self.animate()
def animate(self):
for p in self.particles:
# 更新位置
p['x'] += p['dx']
p['y'] += p['dy']
# 边界检查
if p['x'] < 0 or p['x'] > 800:
p['dx'] *= -1
if p['y'] < 0 or p['y'] > 600:
p['dy'] *= -1
# 移动粒子
self.canvas.moveto(
p['id'],
p['x'],
p['y']
)
# 添加连线效果
self.canvas.delete('line')
for i, p1 in enumerate(self.particles):
for p2 in self.particles[i+1:]:
dist = ((p1['x'] - p2['x'])**2 + (p1['y'] - p2['y'])**2)**0.5
if dist < 100:
opacity = int((1 - dist/100) * 255)
color = '#{:02x}{:02x}{:02x}'.format(opacity, opacity, opacity)
self.canvas.create_line(
p1['x'], p1['y'],
p2['x'], p2['y'],
fill=color, tags='line'
)
self.root.after(20, self.animate)
def run(self):
self.root.mainloop()
if __name__ == "__main__":
app = AnimatedWindow()
app.run()