Python实现小车移动动画:从左上角到右下角,可调节速度,托盘控制
以下代码使用Python的Tkinter库和PIL库,实现一辆小车从窗口左上角匀速移动到右下角的动画效果。程序支持速度调节,并可最小化到托盘,提供恢复和退出功能。
import tkinter as tk
import sys
from PIL import Image, ImageTk
from tkinter import messagebox
import ctypes
import os
class CarApp:
def __init__(self, master):
self.master = master
self.master.geometry('400x400')
self.master.protocol('WM_DELETE_WINDOW', self.on_close)
self.master.iconbitmap('car.ico') # 设置程序图标
# 创建菜单
self.menu = tk.Menu(self.master, tearoff=0)
self.menu.add_command(label='恢复', command=self.restore)
self.menu.add_command(label='退出', command=self.quit)
# 创建托盘图标
self.tray_icon = tk.PhotoImage(file='car.png')
self.tray = ctypes.windll.shell32.Shell_NotifyIconW(0, self.tray_icon, 'Car', self.menu)
self.tray_id = 1
self.tray_flags = 0x00000004 | 0x00000002
self.tray_message = 'Car is running...'
self.tray_menu = [('恢复', self.restore), ('退出', self.quit)]
self.tray_callback = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_uint, ctypes.c_uint, ctypes.c_void_p)
self.tray_menu_callback = self.tray_callback(self.menu_callback)
self.tray_message_callback = self.tray_callback(self.message_callback)
ctypes.windll.user32.Shell_NotifyIconW.restype = ctypes.c_bool
ctypes.windll.user32.Shell_NotifyIconW.argtypes = [ctypes.c_uint, ctypes.POINTER(ctypes.c_void_p)]
# 创建画布
self.canvas = tk.Canvas(self.master, width=400, height=400)
self.canvas.pack()
# 加载小车图片
self.car_image = ImageTk.PhotoImage(Image.open('car.png'))
self.car = self.canvas.create_image(50, 50, image=self.car_image, anchor=tk.NW)
# 初始化小车位置和速度
self.car_x = 50
self.car_y = 50
self.car_speed = 2
# 移动小车
self.move_car()
def move_car(self):
self.canvas.move(self.car, self.car_speed, self.car_speed)
self.car_x += self.car_speed
self.car_y += self.car_speed
# 判断是否到达右下角
if self.car_x < 350 or self.car_y < 350:
self.master.after(10, self.move_car)
else:
messagebox.showinfo('提示', '小车已到达右下角')
def on_close(self):
# 点击关闭按钮时最小化到托盘
self.master.withdraw()
self.tray_data = (self.master.winfo_id(), self.tray_id, self.tray_flags, self.master.iconbitmap(), self.tray_message, self.tray_menu, self.tray_menu_callback)
ctypes.windll.user32.Shell_NotifyIconW(0, ctypes.byref(self.tray_data))
def restore(self):
# 托盘菜单中的恢复按钮点击事件
self.master.deiconify()
def quit(self):
# 托盘菜单中的退出按钮点击事件
self.master.destroy()
os._exit(0)
def menu_callback(self, hwnd, msg, wparam, lparam):
# 托盘菜单点击事件
if lparam == 0x00000100:
self.restore()
elif lparam == 0x00000200:
self.quit()
return 0
def message_callback(self, hwnd, msg, wparam, lparam):
# 托盘图标点击事件
if msg == 0x0203:
self.restore()
return 1
if __name__ == '__main__':
root = tk.Tk()
app = CarApp(root)
root.mainloop()
请确保在运行代码之前已经准备好了car.ico和car.png两个文件,并将其放在与代码文件相同的目录下。
原文地址: https://www.cveoy.top/t/topic/bJN1 著作权归作者所有。请勿转载和采集!