用Python制作属于自己的动态桌面宠物【附源码】

用Python制作属于自己的动态桌面宠物

动画效果描述:代码生成了一个具有随机动画状态、出场效果和移动效果的动画角色窗口。窗口始终位于屏幕最顶层,并且背景透明,使得动画角色在屏幕上自由移动和变化状态,创造出有趣的视觉效果。

# 导入所需的库
import tkinter as tk  # 用于创建图形用户界面
import pyautogui as pt  # 用于获取屏幕尺寸
import random  # 用于生成随机数

# 使用pt.size()获取屏幕尺寸
WIDTH, HEIGHT = pt.size()
# 设置任务栏高度为40像素
taskbarHeight = 40
# 设置图片(角色)的宽度和高度
imgWidth, imgHeight = 500, 370
# 计算窗口位置,使其居中
posX, posY = int(WIDTH / 2 - imgWidth / 2), 0

# 创建Tkinter窗口并设置其属性
root = tk.Tk()
root.geometry(f"{int(imgWidth)}x{int(imgHeight)}+{posX}+{posY}")  # 设置窗口尺寸和位置
root.overrideredirect(1)  # 移除窗口边框
root.configure(bg='black')  # 设置窗口背景色为黑色
root.wm_attributes('-transparentcolor', 'black')  # 设置透明色为黑色
root.wm_attributes('-topmost', 1)  # 设置窗口始终位于最顶层

# 加载不同状态下的动画图片,gif动图插入
idleRight = [tk.PhotoImage(file='./Gif/IdleRight.gif', format='gif -index %i' % i) for i in range(4)]
idleLeft = [tk.PhotoImage(file='./Gif/IdleLeft.gif', format='gif -index %i' % i) for i in range(4)]
runRight = [tk.PhotoImage(file='./Gif/RunRight.gif', format='gif -index %i' % i) for i in range(6)]
runLeft = [tk.PhotoImage(file='./Gif/RunLeft.gif', format='gif -index %i' % i) for i in range(6)]
fall = [tk.PhotoImage(file='./Gif/Fall.gif', format='gif -index %i' % i) for i in range(2)]

# 定义动画状态字典
status = {
    0: fall,
    1: idleRight,
    2: idleLeft,
    3: runRight,
    4: runLeft
}
status_num = 0  # 当前状态编号

# 创建角色标签并初始显示为空闲状态向左的图片
player = tk.Label(root, image=idleLeft[0], bg='black', bd=0)
player.place(relx=0.5, rely=0.5, anchor=tk.CENTER)  # 将角色标签置于窗口中心


# 定义改变状态的函数
def changeStatus():
    global status_num
    status_num = random.randint(1, 4)  # 随机改变状态编号
    root.after(random.randint(1000, 5000), changeStatus)  # 在1到5秒之间再次调用自己


# 定义掉落函数
def falling():
    global status_num, posX, posY
    if root.winfo_y() + imgHeight < HEIGHT - taskbarHeight:
        status_num = 0  # 设置为掉落状态
        posY += 1  # 向下移动窗口
        root.geometry(f"{int(imgWidth)}x{int(imgHeight)}+{posX}+{posY}")  # 更新窗口位置
    elif root.winfo_y() + imgHeight >= HEIGHT - taskbarHeight and status_num == 0:
        status_num = 1  # 到达底部时改变为空闲状态
    root.after(1, falling)  # 每隔1毫秒调用一次自己以实现连续动画效果


# 定义移动函数
def moving():
    global status_num, posX
    # 根据当前状态(跑步向右)移动窗口
    if status_num == 3 and root.winfo_x() + imgWidth - 100 < WIDTH:
        posX += 1
        root.geometry(f"{int(imgWidth)}x{int(imgHeight)}+{posX}+{posY}")
    elif status_num == 3 and root.winfo_x() + imgWidth - 100 >= WIDTH:
        status_num = 1  # 到达右边界时改变为空闲状态

    # 根据当前状态(跑步向左)移动窗口
    if status_num == 4 and root.winfo_x() + 100 > 0:
        posX -= 1
        root.geometry(f"{int(imgWidth)}x{int(imgHeight)}+{posX}+{posY}")
    elif status_num == 4 and root.winfo_x() + 100 <= 0:
        status_num = 2  # 到达左边界时改变为空闲状态
    root.after(3, moving)  # 每隔3毫秒调用一次自己以实现连续动画效果


# 定义动画函数
def Anim(num, rate, character):
    if num < len(status[status_num]) - 1:
        num += 1  # 更新帧编号
    else:
        num = 0  # 重置帧编号
    character.configure(image=status[status_num][num])  # 更新角色标签的图像
    root.after(rate, lambda: Anim(num, rate, character))  # 每隔一定时间调用一次自己以实现连续动画效果


# 启动程序
changeStatus()
falling()
moving()
Anim(0, 150, player)  # 开始动画,初始帧编号为0,帧率为150毫秒/帧
root.mainloop()  # 启动Tkinter事件循环

注意: 大家可以插入自己喜欢的gif动画

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温轻舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值