以下代码使用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.icocar.png两个文件,并将其放在与代码文件相同的目录下。

Python实现小车移动动画:从左上角到右下角,可调节速度,托盘控制

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

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