



“嘿,老板不发年终奖?没关系!今天用 300 行 Python 给自己放一场沉浸式烟花——自带姓名表白、5 种爆炸形态、还能一键截图当壁纸。零音响、零污染、零成本,tkinter 版‘赛博烟花’ 让你在公司电脑也能浪漫到飞起!”
fireworks/├─ main.py # 单文件即可运行└─ requirements.txt # 仅 2 行:tkinter(内置)+ pillow(可选)运行效果:
fireworks_年月日_时分秒.png。if __name__ == "__main__": root = tk.Tk() app = EnhancedFireworks(root) root.mainloop()层级解析
EnhancedFireworks 是 上帝类,负责“画布+逻辑+数据”一站式管理,下文全部围绕它展开。self.fireworks = [] # 上升阶段的发射体self.explosions = [] # 爆炸后的粒子群self.sparks = [] # 中心闪光锦上添花self.running = False# 总开关self.paused = False# 暂停旗层级解析
running 负责“生死”,paused 负责“冻帧”;defget_random_color(self): hue = random.random() saturation = 0.8 + random.random() * 0.2 value = 0.8 + random.random() * 0.2 r, g, b = colorsys.hsv_to_rgb(hue, saturation, value)return"#{:02x}{:02x}{:02x}".format(int(r*255), int(g*255), int(b*255))层级解析
defcreate_firework(self): x = random.randint(100, self.canvas.winfo_width()-100) color = self.get_random_color() velocity = random.uniform(6, 12) target_y = random.randint(150, self.canvas.winfo_height()//2) firework = {"x": x, "y": self.canvas.winfo_height(),"radius": random.randint(2, 4),"color": color, "velocity": velocity,"gravity": 0.15 + random.random()*0.1,"target_y": target_y,"trail": [],"id": self.canvas.create_oval(...) } self.fireworks.append(firework)层级解析
target_y 随机 1/2 上方→模拟“升空”;defexplode(self, x, y, color): explosion_type = self.firework_type.get() ...for _ in range(particle_count): angle = random.choice(angles) + random.uniform(-0.2, 0.2) if angles else random.uniform(0, 2*math.pi) speed = random.uniform(2, 5) if explosion_type == "瀑布"else random.uniform(1, 6) gravity = random.uniform(0.1, 0.3) if explosion_type == "瀑布"else random.uniform(0.03, 0.15) particle = {"vx": speed * math.cos(angle),"vy": speed * math.sin(angle),"gravity": gravity,"alpha": 1.0,"decay": random.uniform(0.015, 0.04), ... }层级解析
defanimate(self):try: self.update_fireworks()except Exception as e: print(f"动画更新错误: {e}") self.root.after(30, self.animate) # 约33FPS层级解析
defupdate_name_display(self): ... size = max(20, 40 - int(elapsed * 4)) color = self.get_random_color() self.canvas.create_text(x+1, y+1, text=self.name, font=("SimHei", size, "bold"), fill="#000", tags="name_text") self.canvas.create_text(x, y, text=self.name, font=("SimHei", size, "bold"), fill=color, tags="name_text")defsave_canvas(self): ps = self.canvas.postscript(colormode='color') img = Image.open(io.BytesIO(ps.encode('utf-8'))) filename = f"fireworks_{time.strftime('%Y%m%d_%H%M%S')}.png" img.save(filename, "png")层级解析
alpha = 1 - elapsed/5;postscript 矢量导出→PIL 读取→PNG 保存,无需 win32api 也能跨平台。| GUI 框架 | ||
| 颜色理论 | ||
| 运动学 | ||
| 面向对象 | ||
| 异常防御 | ||
| 扩展生态 |
pyaudio 解析节拍,重载 firework_interval 实现“鼓点发射”;tk.Toplevel 多窗口,把主画布拖到副屏,演唱会现场 GET;pyscript 或 skulpt 把 tkinter 移植到浏览器,朋友圈直接扫码看烟花;numpy 矢量化计算,10 万粒子也不卡;.exe 求婚神器,“输入她名字,烟花+截图+戒指弹窗” 一条龙服务。全文 3 000+ 字,从一行
tk.Tk()到 5 种爆炸形态,再到截图保存,层级清晰、注释密集、物理+颜色+GUI 三修。复制代码跑一把,今晚就让 Python 给你放一场不会结束的烟火!
点击【关注+收藏】获取最新的实战代码案例
用Python打造汉字笔画查询工具:从GUI界面到笔顺动画实现
Python超实用 Markdown 转富文本神器 —— 代码全解析
【实战1】
【实战2】
【实战3】
【实战4】

