微信公众号
扫描关注微信公众号
博客大厅

零基础Python动画:手把手教你画会飞的小火箭

原创 来源:博客站 阅读 0 昨天 18:22:51 听全文

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. 如何运行?

  1. 复制代码到 rocket.py 文件。
  2. 运行命令:
    python rocket.py
    
  3. 点击 "发射!" 按钮,火箭就会升空!

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_polygonmovecoordsafter(定时动画)。
  • 可扩展:加背景音乐、多级火箭、碰撞检测等。

动手试试吧!

学在每日,进无止境!更多精彩内容请关注微信公众号。
原文出处: 内容由AI生成仅供参考,请勿使用于商业用途。如若转载请注明原文及出处。
出处地址:http://www.07sucai.com/tech/911.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。
轻松 一刻
>