大家好,我是小黄。
今天我们使用python实现一个桌面宠物。只需要gif动态图片就行。超级简单容易上手。
#完整源代码可在下方图片免费获取
一:下载相关的库文件。
我们本次使用到的库文件为:tkinter和pyautogui
下载命令:
pip install tkinter
pip install pyautogui
二.我们把gif导入,放在DestTop.py同级下面即可。
DeskTop.py(不完整的)
import tkinter as tk
import pyautogui as pt
import random
import os
from PIL import Image, ImageTk
# 获取主屏幕分辨率
WIDTH, HEIGHT = pt.size()
taskbarHeight = 40
# 将人物大小减少 40%
imgWidth, imgHeight = 670, 550
# 计算右侧10%区域的起始位置
right_margin = int(WIDTH * 0.1)
posX = WIDTH - imgWidth - right_margin # 右侧10%区域内的初始X位置
posY = 0 # 初始Y位置
# 创建主窗口
root = tk.Tk()
root.geometry(f"{imgWidth}x{imgHeight}+{posX}+{posY}")
root.overrideredirect(1)
root.configure(bg='black')
root.attributes('-transparentcolor', 'black')
root.wm_attributes('-topmost', 1)
# 右键菜单
def create_context_menu(event):
context_menu.post(event.x_root, event.y_root)
def exit_application():
root.quit()
context_menu = tk.Menu(root, tearoff=0)
context_menu.add_command(label="退出", command=exit_application)
def load_images(file_path):
images = []
try:
img = Image.open(file_path)
for frame in range(img.n_frames): # 使用 Pillow 获取帧数
img.seek(frame) # 定位到每一帧
images.append(ImageTk.PhotoImage(img.copy())) # 复制当前帧并转换为 PhotoImage
except Exception as e:
print(f"Error loading frames from {file_path}: {e}")
return images
# 获取当前脚本的目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 更新 GIF 文件路径
idleRight = load_images(os.path.join(current_dir, "bar.gif"))
idleLeft = load_images(os.path.join(current_dir, "bar1.gif"))
runRight = load_images(os.path.join(current_dir, "bar1.gif"))
runLeft = load_images(os.path.join(current_dir, "bar3.gif"))
fall = load_images(os.path.join(current_dir, "bar1.gif"))
status = {
0: fall,
1: idleRight,
2: idleLeft,
3: runRight,
4: runLeft
}
status_num = 0
canvas = tk.Canvas(root, width=imgWidth, height=imgHeight, bg='black', highlightthickness=0)
canvas.pack()
player = canvas.create_image(imgWidth // 2, imgHeight // 2, image=idleLeft[0])
# 说话文本列表
phrases = [
"海鸥别叫啦,从今天起,我也是漂泊者啊",
"深山踏红叶,耳畔闻鹿鸣",
"可叹,落叶飘零",
"我很喜欢枫叶,可惜,枫叶红时,总多离别。",
"拾花鸟之一趣,照月风之长路",
"闲聊?自然!"
]
def changeStatus():
global status_num
status_num = random.randint(1, 4)
root.after(random.randint(1000, 5000), changeStatus)
def falling():
global status_num, posY
if root.winfo_y() + imgHeight < HEIGHT - taskbarHeight:
status_num = 0
posY += 10 # 增加每次掉落的高度
root.geometry(f"{imgWidth}x{imgHeight}+{posX}+{posY}")
elif root.winfo_y() + imgHeight >= HEIGHT - taskbarHeight and status_num == 0:
status_num = 1
root.after(10, falling) # 保持掉落速度
运行效果:
打包为exe可执行文件:
pyinstaller --onefile --noconsole --exclude-module numpy --exclude-module pandas --add-data "您的绝对路径\\bar.gif;." --add-data "您的绝对路径\\bar1.gif;." --add-data "您的绝对路径\\bar2.gif;." --add-data "您的绝对路径\\bar3.gif;." DestTop.py
完整源代码和gif资料包请下方获取👇↓↓↓