python桌面宠物


import sys
import os
import random
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5 import QtWidgets, QtGui

'''桌面宠物'''


class DesktopPet(QWidget):



    def __init__(self, parent=None, **kwargs):
        super(DesktopPet, self).__init__(parent)
        # 初始化
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)
        self.setAutoFillBackground(False)
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.repaint()
        # 随机导入一个宠物
        self.pet_images, iconpath = self.randomLoadPetImages()
        # 设置退出选项
        quit_action = QAction('退出', self, triggered=self.quit)
        quit_action.setIcon(QIcon(iconpath))
        self.tray_icon_menu = QMenu(self)
        self.tray_icon_menu.addAction(quit_action)
        self.tray_icon = QSystemTrayIcon(self)
        self.tray_icon.setIcon(QIcon(iconpath))
        self.tray_icon.setContextMenu(self.tray_icon_menu)
        self.tray_icon.show()
        # 当前显示的图片
        self.image = QLabel(self)
        self.setImage(self.pet_images[0][0])

        # 是否跟随鼠标
        self.is_follow_mouse = False
        # 宠物拖拽时避免鼠标直接跳到左上角
        self.mouse_drag_pos = self.pos()
        # 显示
        self.resize(200, 200)
        self.randomPosition()
        self.show()
        # 宠物动画动作执行所需的一些变量
        self.is_running_action = False
        self.action_images = []
        self.action_pointer = 0
        self.action_max_len = 0
        # 每隔一段时间做个动作
        self.timer = QTimer()
        self.timer.timeout.connect(self.randomAct)
        self.timer.start(200)

    '''随机做一个动作'''

    def randomAct(self):
        if not self.is_running_action:
            self.is_running_action = True
            self.action_images = random.choice(self.pet_images)
            self.action_max_len = len(self.action_images)
            self.action_pointer = 0
        self.runFrame()

    '''完成动作的每一帧'''

    def runFrame(self):
        if self.action_pointer == self.action_max_len:
            self.is_running_action = False
            self.action_pointer = 0
            self.action_max_len = 0
        self.setImage(self.action_images[self.action_pointer])
        self.action_pointer += 1

    '''设置当前显示的图片'''

    def setImage(self, image):
        self.image.setPixmap(QPixmap.fromImage(image))

    '''随机导入一个桌面宠物的所有图片,在py相同文件夹中新建图片文件夹命名为‘resources’,
    再新建文件夹名‘pet_1’,将图片保存在‘pet_1’中,也可以多设置几个文件夹,将不同类型的图片保存在里面
    
    
    '''
    
    def randomLoadPetImages(self):
        ROOT_DIR = 'resources'
        ACTION_DISTRIBUTION = [['1', '2', '3', '4', '5', '6'],
                               ['7', '8', '9', '10', '11'],
                               ['12', '13', '14','15', '16', '17','18'], 
                               ['19'],
                               ['20'], 
                               ['21']]

        PET_ACTIONS_MAP = {'pet_1': ACTION_DISTRIBUTION}

        pet_name = random.choice(list(PET_ACTIONS_MAP.keys()))
        actions = PET_ACTIONS_MAP[pet_name]
        pet_images = []
        for action in actions:
            pet_images.append(
                [self.loadImage(os.path.join(ROOT_DIR, pet_name, 'shimo' + item + '.png')) for item in action])
        iconpath = os.path.join(ROOT_DIR, pet_name, 'shimo1.png')
        return pet_images, iconpath

    '''鼠标左键按下时, 宠物将和鼠标位置绑定'''

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.is_follow_mouse = True
            self.mouse_drag_pos = event.globalPos() - self.pos()
            event.accept()
            self.setCursor(QCursor(Qt.OpenHandCursor))

    '''鼠标移动, 则宠物也移动'''

    def mouseMoveEvent(self, event):
        if Qt.LeftButton and self.is_follow_mouse:
            self.move(event.globalPos() - self.mouse_drag_pos)
            event.accept()

    '''鼠标释放时, 取消绑定'''

    def mouseReleaseEvent(self, event):
        self.is_follow_mouse = False
        self.setCursor(QCursor(Qt.ArrowCursor))

    '''导入图像'''

    def loadImage(self, imagepath):
        image = QImage()
        image.load(imagepath)
        return image

    '''随机到一个屏幕上的某个位置'''

    def randomPosition(self):
        screen_geo = QDesktopWidget().screenGeometry()
        pet_geo = self.geometry()
        width = int((screen_geo.width() - pet_geo.width()) * random.random())
        height =int((screen_geo.height() - pet_geo.height()) * random.random())
        self.move(width, height)

    '''退出程序'''

    def quit(self):
        self.close()
        sys.exit()


'''run'''
if __name__ == '__main__':
    app = QApplication(sys.argv)
    pet = DesktopPet()
    sys.exit(app.exec_())

在别人的程序里面有一个import cfg,我找了半天也没找到,后来才知道cfg是原创者自己写的库,我的程序里面直接添加到源程序里面了,不需要导入cfg这个库了。

这个程序的主要逻辑就是将静态图片加速显示出来,这样就变成了动图。

如果感兴趣可以试一试,然后多添加一些功能。

我使用的版本是anaconda,python3.8,一定要记得选择正确的环境,不然的话PyQt5会报错,说没有那部分模块。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值