
Python不仅可以处理数据,还能制作有趣的图形动画!今天,我们将用Tkinter
(Python内置的GUI库)绘制一个会飞的小火箭,并让它从屏幕底部升空。
最终效果:
- 黑色星空背景 + 银色火箭
- 倒计时3秒后发射
- 火箭尾部有随机火焰效果
- 星星随机闪烁
2. 完整代码
import tkinter as tk
import random
import time
class RocketAnimation:
def __init__(self, master):
self.master = master
master.title("Python火箭发射")
# 创建画布(黑色背景模拟夜空)
self.canvas = tk.Canvas(master, width=400, height=600, bg='black')
self.canvas.pack()
# 绘制星空
self.draw_stars(50)
# 火箭组件
self.body = None # 火箭主体
self.nose = None # 火箭头部
self.flame = None # 火焰
self.windows = [] # 舷窗
# 初始化火箭
self.setup_rocket()
# 添加发射按钮
self.launch_btn = tk.Button(master, text="发射!", command=self.launch_sequence)
self.launch_btn.pack(pady=10)
# 发射状态
self.is_launching = False
def draw_stars(self, count):
"""绘制随机星星"""
for _ in range(count):
x = random.randint(0, 400)
y = random.randint(0, 600)
size = random.randint(1, 3)
self.canvas.create_oval(x, y, x+size, y+size, fill='white', outline='')
def setup_rocket(self):
"""初始化火箭图形"""
# 火箭主体(三角形)
self.body = self.canvas.create_polygon(
200, 500, 180, 550, 220, 550,
fill='#c0c0c0', outline='white'
)
# 火箭头部(椭圆形)
self.nose = self.canvas.create_oval(
190, 490, 210, 510,
fill='red', outline='gold'
)
# 火箭火焰
self.flame = self.canvas.create_polygon(
195, 550, 200, 570, 205, 550,
fill='orange', outline=''
)
# 火箭舷窗
self.windows.append(self.canvas.create_oval(195, 515, 205, 525, fill='#87CEEB'))
self.windows.append(self.canvas.create_oval(195, 530, 205, 540, fill='#87CEEB'))
def launch_sequence(self):
"""发射倒计时"""
if self.is_launching:
return
self.is_launching = True
self.launch_btn.config(state=tk.DISABLED)
# 倒计时3秒
countdown = self.canvas.create_text(200, 300, text="3", font=("Arial", 48), fill='red')
for i in range(3, 0, -1):
self.canvas.itemconfig(countdown, text=str(i))
self.master.update()
time.sleep(1)
self.canvas.delete(countdown)
self.animate_rocket() # 开始动画
def animate_rocket(self):
"""火箭升空动画"""
# 如果火箭飞出屏幕,重置
if self.canvas.coords(self.body)[1] < -50:
self.reset_rocket()
return
# 移动火箭(向上)
self.canvas.move(self.body, 0, -8)
self.canvas.move(self.nose, 0, -8)
self.canvas.move(self.flame, 0, -8)
for window in self.windows:
self.canvas.move(window, 0, -8)
# 随机火焰效果
flame_height = random.randint(15, 25)
self.canvas.coords(
self.flame,
195, self.canvas.coords(self.body)[3],
200, self.canvas.coords(self.body)[3] + flame_height,
205, self.canvas.coords(self.body)[3]
)
# 随机星星闪烁
if random.random() < 0.1:
for star in self.canvas.find_all():
if self.canvas.type(star) == 'oval' and self.canvas.itemcget(star, 'fill') == 'white':
self.canvas.itemconfig(star, fill='yellow' if random.random() < 0.3 else 'white')
# 继续动画(50ms后更新)
self.master.after(50, self.animate_rocket)
def reset_rocket(self):
"""重置火箭位置"""
self.canvas.delete(self.body)
self.canvas.delete(self.nose)
self.canvas.delete(self.flame)
for window in self.windows:
self.canvas.delete(window)
self.windows = []
self.setup_rocket()
self.is_launching = False
self.launch_btn.config(state=tk.NORMAL)
# 启动程序
root = tk.Tk()
app = RocketAnimation(root)
root.mainloop()
3. 代码解析
(1)初始化界面
Canvas
创建400×600像素的黑色画布(模拟夜空)。draw_stars(50)
随机生成50颗星星。
(2)绘制火箭
- 主体:用
create_polygon
画三角形。 - 头部:用
create_oval
画椭圆形。 - 火焰:动态变化的三角形。
- 舷窗:两个蓝色小圆。
(3)发射动画
- 倒计时:3秒后火箭升空。
- 移动火箭:
canvas.move()
让所有组件向上移动。 - 火焰动画:随机调整火焰高度,模拟喷射效果。
- 星星闪烁:随机让星星变黄再恢复白色。
(4)重置火箭
当火箭飞出屏幕后,自动回到起点,可再次发射。
4. 如何运行?
- 复制代码到
rocket.py
文件。 - 运行命令:
python rocket.py
- 点击 "发射!" 按钮,火箭就会升空!
5. 扩展玩法
✅ 加音效(需 pygame
):
import pygame
pygame.mixer.init()
pygame.mixer.Sound("launch.wav").play()
✅ 加烟雾尾迹:
# 在 animate_rocket() 里添加:
self.canvas.create_oval(195, y+10, 205, y+15, fill='gray', tags='smoke')
✅ 改成横向飞行:
修改 canvas.move(body, -8, 0)
让火箭水平移动。
6. 总结
- Tkinter 适合做简单动画,比
turtle
更灵活。 - 关键方法:
create_polygon
、move
、coords
、after
(定时动画)。 - 可扩展:加背景音乐、多级火箭、碰撞检测等。
动手试试吧!
学在每日,进无止境!更多精彩内容请关注微信公众号。

原文出处:
内容由AI生成仅供参考,请勿使用于商业用途。如若转载请注明原文及出处。
出处地址:http://www.07sucai.com/tech/911.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。