Python 小车动画:从左上角到右下角移动,可调节速度,支持后台运行
以下是一个使用 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 替换为您自己的托盘图标。
代码解释:
- 导入必要的库:
tkinter: 用于创建 GUI 窗口sys: 用于退出程序time: 用于控制动画速度messagebox: 用于显示确认框PIL: 用于加载和处理图片threading: 用于创建线程以实现后台运行os: 用于获取文件路径ctypes: 用于操作 Windows API
- 创建 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方法:- 显示确认框,询问用户是否退出程序
- 停止程序运行
- 销毁窗口
- 主程序:
- 创建
tkinter窗口 - 创建
CarAnimation对象 - 运行主循环
原文地址: http://www.cveoy.top/t/topic/bKfR 著作权归作者所有。请勿转载和采集!