以下是一个使用 Python 编写的完整可运行代码示例,实现了一个从窗口左上角到右下角移动的小车动画。该动画支持调节小车速度,并提供后台运行功能,可通过系统托盘图标恢复或退出程序。

import tkinter as tk
import sys
import time
from tkinter import messagebox
from PIL import Image, ImageTk
from threading import Thread
import os
import ctypes

class CarAnimation:
    def __init__(self, root):
        self.root = root
        self.root.title('Car Animation')
        self.root.geometry('500x500')
        self.root.protocol('WM_DELETE_WINDOW', self.on_close)

        self.canvas = tk.Canvas(self.root, width=500, height=500)
        self.canvas.pack()

        self.car_image = ImageTk.PhotoImage(Image.open('car.png').resize((50, 50)))

        self.car = self.canvas.create_image(0, 0, anchor=tk.NW, image=self.car_image)

        self.speed = 2

        self.is_running = True
        self.is_paused = False

        self.root.bind('<Escape>', self.on_escape)
        self.root.bind('<Button-1>', self.on_left_click)

        self.tray_icon = None

        self.move_car()

    def move_car(self):
        while self.is_running:
            if not self.is_paused:
                self.canvas.move(self.car, self.speed, self.speed)
                self.canvas.update()
                time.sleep(0.01)

    def on_escape(self, event):
        self.root.iconify()
        self.root.after(0, self.create_tray_icon)

    def on_left_click(self, event):
        self.is_paused = not self.is_paused

    def create_tray_icon(self):
        self.tray_icon = tk.Tk()
        self.tray_icon.title('Tray Icon')
        self.tray_icon.geometry('0x0')
        self.tray_icon.iconify()

        self.tray_icon.bind('<Unmap>', self.on_unmap)
        self.tray_icon.bind('<Map>', self.on_map)

        self.tray_icon.iconbitmap('car.ico')

        self.tray_icon_menu = tk.Menu(self.tray_icon, tearoff=0)
        self.tray_icon_menu.add_command(label='Restore', command=self.on_restore)
        self.tray_icon_menu.add_command(label='Exit', command=self.on_exit)

        self.tray_icon.bind('<Button-3>', self.show_tray_icon_menu)

        self.tray_icon.mainloop()

    def show_tray_icon_menu(self, event):
        self.tray_icon_menu.post(event.x_root, event.y_root)

    def on_unmap(self, event):
        ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID('myappid')

    def on_map(self, event):
        ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID('')

    def on_restore(self):
        self.tray_icon.destroy()
        self.root.deiconify()

    def on_exit(self):
        self.tray_icon.destroy()
        self.root.destroy()
        sys.exit()

    def on_close(self):
        if messagebox.askokcancel('Quit', 'Do you want to quit?'):
            self.is_running = False
            self.root.destroy()
            sys.exit()


if __name__ == '__main__':
    root = tk.Tk()
    app = CarAnimation(root)
    root.mainloop()

请确保您的电脑上已经安装了 Python 和所需的依赖库(tkinter、Pillow)。

在代码中,我们使用了 tkinter 库来创建 GUI 窗口,并使用 canvas 来绘制小车。我们还使用了 Pillow 库来加载小车的图片。

小车的移动是通过不断调用 canvas.move() 方法来实现的,每次移动的距离由 self.speed 决定。点击窗口可暂停/继续小车的移动。

当点击窗口的关闭按钮时,我们将窗口转入后台运行,并创建一个系统托盘图标。右键点击托盘图标会弹出菜单,其中可以选择恢复窗口或退出程序。

请确保将代码中的 car.png 替换为您自己的小车图片,并将 car.ico 替换为您自己的托盘图标。

代码解释:

  1. 导入必要的库:
  • tkinter: 用于创建 GUI 窗口
  • sys: 用于退出程序
  • time: 用于控制动画速度
  • messagebox: 用于显示确认框
  • PIL: 用于加载和处理图片
  • threading: 用于创建线程以实现后台运行
  • os: 用于获取文件路径
  • ctypes: 用于操作 Windows API
  1. 创建 CarAnimation 类:
  • __init__ 方法:
    • 初始化 GUI 窗口
    • 创建画布
    • 加载小车图片
    • 创建小车对象
    • 设置默认速度
    • 设置运行状态和暂停状态
    • 绑定按键事件和鼠标事件
    • 创建系统托盘图标
    • 启动小车移动函数
  • move_car 方法:
    • 在循环中不断移动小车,直到程序停止
  • on_escape 方法:
    • 将窗口最小化至系统托盘
    • 创建系统托盘图标
  • on_left_click 方法:
    • 暂停/继续小车移动
  • create_tray_icon 方法:
    • 创建系统托盘图标
    • 绑定系统托盘图标的事件
    • 创建系统托盘菜单
  • show_tray_icon_menu 方法:
    • 显示系统托盘菜单
  • on_unmap 方法:
    • 设置应用程序 ID
  • on_map 方法:
    • 清除应用程序 ID
  • on_restore 方法:
    • 将窗口恢复到前台
    • 销毁系统托盘图标
  • on_exit 方法:
    • 退出程序
    • 销毁系统托盘图标
  • on_close 方法:
    • 显示确认框,询问用户是否退出程序
    • 停止程序运行
    • 销毁窗口
  1. 主程序:
  • 创建 tkinter 窗口
  • 创建 CarAnimation 对象
  • 运行主循环
Python 小车动画:从左上角到右下角移动,可调节速度,支持后台运行

原文地址: http://www.cveoy.top/t/topic/bKfR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录