桌面宠物程序1-1(python实现)

2025年4月22日 999+浏览

1、基本功能:
宠物会在桌面上随机移动。
用户可以通过鼠标点击宠物,触发交互(如改变表情)。
2、扩展功能:
宠物会根据鼠标位置做出反应。
添加简单的动画效果。

                
import tkinter as tk
from PIL import Image, ImageTk
import random

class DesktopPet:
    def __init__(self, root):
        # 初始化窗口
        self.root = root
        self.root.overrideredirect(True)  # 去掉窗口边框
        self.root.attributes("-topmost", True)  # 窗口置顶
        self.root.wm_attributes("-transparentcolor", "white")  # 设置透明颜色

        # 加载宠物图像
        self.pet_images = [
            ImageTk.PhotoImage(Image.open("pet_normal.png").convert("RGBA")),
            ImageTk.PhotoImage(Image.open("pet_happy.png").convert("RGBA"))
        ]
        self.current_image = 0  # 当前显示的图片索引

        # 创建画布并放置宠物
        self.canvas = tk.Canvas(root, width=100, height=100, highlightthickness=0)
        self.canvas.pack()
        self.pet = self.canvas.create_image(50, 50, image=self.pet_images[self.current_image])

        # 绑定事件
        self.canvas.bind("<Button-1>", self.on_click)  # 鼠标点击事件
        self.canvas.bind("<Motion>", self.on_hover)   # 鼠标悬停事件

        # 开始动画
        self.move_pet()

    def on_click(self, event):
        """处理鼠标点击事件"""
        self.current_image = 1  # 切换到“开心”状态
        self.canvas.itemconfig(self.pet, image=self.pet_images[self.current_image])
        self.root.after(500, self.reset_image)  # 半秒后恢复默认状态

    def on_hover(self, event):
        """处理鼠标悬停事件"""
        x, y = event.x, event.y
        print(f"Mouse is at ({x}, {y})")
        # 可以在这里添加更多逻辑,比如让宠物跟随鼠标

    def reset_image(self):
        """重置宠物图片为默认状态"""
        self.current_image = 0
        self.canvas.itemconfig(self.pet, image=self.pet_images[self.current_image])

    def move_pet(self):
        """随机移动宠物"""
        x = random.randint(-10, 10)
        y = random.randint(-10, 10)
        self.canvas.move(self.pet, x, y)

        # 获取当前窗口位置
        current_x, current_y = self.root.winfo_x(), self.root.winfo_y()
        new_x = current_x + x
        new_y = current_y + y

        # 更新窗口位置
        self.root.geometry(f"+{new_x}+{new_y}")

        # 循环调用,形成动画效果
        self.root.after(100, self.move_pet)

if __name__ == "__main__":
    # 创建主窗口
    root = tk.Tk()
    pet = DesktopPet(root)
    root.mainloop()