diff --git a/content/post/desktop-pet.md b/content/post/desktop-pet.md new file mode 100644 index 00000000..0be77953 --- /dev/null +++ b/content/post/desktop-pet.md @@ -0,0 +1,116 @@ ++++ +title = "屏幕宠物" +date = 2024-12-22T12:22:00+08:00 +lastmod = 2024-12-22T13:07:25+08:00 +draft = false ++++ + +写了个 Python 程序,用到了 tkinter 和 pillow 模块,实现在桌面播放 gif 图片,给桌面增加一点节日气氛。
+ + + + +## Python {#python} + +具体如下:
+ +```python +import tkinter as tk +from PIL import Image, ImageTk, ImageSequence + +class DesktopPet: + def __init__(self, gif_path): + self.root = tk.Tk() + self.is_borderless = True # 初始化为无边框状态 + + self.root.title("") # 设置窗口标题 + self.root.overrideredirect(self.is_borderless) # 去掉边框 + self.root.attributes("-topmost", True) # 窗口置顶 + self.root.attributes("-transparentcolor", "white") # 设置透明颜色 + self.root.attributes("-toolwindow", True) # 去掉最大化最小化 + + # 禁用窗口最大化、最小化按钮 + self.root.resizable(False, False) # 禁止调整窗口大小 + + # 加载并处理 GIF 图像 + self.frames = [] + self.width, self.height = 0, 0 + self.load_and_process_gif(gif_path) + + # 创建一个标签控件来显示GIF + self.label = tk.Label(self.root, image=self.frames[0], bg="white") # 设置白色背景 + self.label.pack() + + # 设置帧动画 + self.frame_index = 0 + self.update_frame() + + # 初始化宠物的位置 + self.x, self.y = 100, 100 + self.root.geometry(f"{self.width}x{self.height}+{self.x}+{self.y}") + + # 定时器检查鼠标位置 + self.check_mouse_position() + + def load_and_process_gif(self, gif_path): + gif = Image.open(gif_path) + # 缩小尺寸 + original_width, original_height = gif.size + self.width = original_width // 2 + self.height = original_height // 2 + + # 处理每一帧:缩小并去掉黑色背景 + for frame in ImageSequence.Iterator(gif): + frame = frame.convert("RGBA") # 转换为 RGBA 模式 + # 缩小图片 + frame = frame.resize((self.width, self.height), Image.Resampling.LANCZOS) + + # 替换黑色背景为透明 + datas = frame.getdata() + new_data = [] + for item in datas: + if item[:3] == (0, 0, 0): # 如果是黑色 + new_data.append((255, 255, 255, 0)) # 替换为透明 + else: + new_data.append(item) + frame.putdata(new_data) + + # 转换为 ImageTk.PhotoImage 格式 + self.frames.append(ImageTk.PhotoImage(frame)) + + def update_frame(self): + self.frame_index = (self.frame_index + 1) % len(self.frames) + self.label.config(image=self.frames[self.frame_index]) + self.root.after(100, self.update_frame) # 每100ms更新一次帧 + + def check_mouse_position(self): + # 获取鼠标的屏幕位置 + mouse_x, mouse_y = self.root.winfo_pointerxy() + + # 获取窗口的屏幕范围 + x1 = self.root.winfo_x() + y1 = self.root.winfo_y() + x2 = x1 + self.width + y2 = y1 + self.height + + # 判断鼠标是否在窗口范围内 + if x1 <= mouse_x <= x2 and y1 <= mouse_y <= y2: + if self.is_borderless: # 如果当前是无边框状态 + self.is_borderless = False + self.root.overrideredirect(False) # 显示窗口栏 + else: + if not self.is_borderless: # 如果当前是有边框状态 + self.is_borderless = True + self.root.overrideredirect(True) # 隐藏窗口栏 + + # 定时器再次检查 + self.root.after(200, self.check_mouse_position) # 每200ms检查一次 + + def run(self): + self.root.mainloop() + +if __name__ == "__main__": + pet = DesktopPet("pet.gif") # 替换为你的GIF文件路径 + pet.run() +``` +