Python制作的桌面宠物-python实战-python源码-python项目练习

Python制作的桌面宠物

随机从64种宠物里生成,从一款是你喜欢的,赶紧来认养吧

#完整源代码可在下方图片免费获取

运行程序前请先安装PyQt5。程序入口DesktopPet.py。程序运行截图:

DesktopPet.py

python 复制代码
'''
Function:
  实现一款桌面宠物
'''
import os
import cfg
import sys
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(128, 128)
    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(500)
  '''随机做一个动作'''
  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))
  '''随机导入一个桌面宠物的所有图片'''
  def randomLoadPetImages(self):
    pet_name = random.choice(list(cfg.PET_ACTIONS_MAP.keys()))
    actions = cfg.PET_ACTIONS_MAP[pet_name]
    pet_images = []
    for action in actions:
      pet_images.append([self.loadImage(os.path.join(cfg.ROOT_DIR, pet_name, 'shime'+item+'.png')) for item in action])
    iconpath = os.path.join(cfg.ROOT_DIR, pet_name, 'shime1.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 = (screen_geo.width() - pet_geo.width()) * random.random()
    height = (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_())

配置文件cfg.py

python 复制代码
'''配置文件'''


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'],
             ['22'],
             ['23', '24', '25'],
             ['26',  '27', '28', '29'],
             ['30', '31', '32', '33'],
             ['34', '35', '36', '37'],
             ['38', '39', '40', '41'],
             ['42', '43', '44', '45', '46']]
PET_ACTIONS_MAP = {'pet_1': ACTION_DISTRIBUTION}
for i in range(2, 65): PET_ACTIONS_MAP.update({'pet_%s' % i: ACTION_DISTRIBUTION})

完整源代码请下方获取👇↓↓↓

相关推荐
不吃土豆的马铃薯12 分钟前
C++ 高性能网络缓冲区 Buffer 源码解析
linux·服务器·开发语言·网络·c++
数据法师27 分钟前
QuickSay :基于 Qt 的轻量级快捷短语管理工具
开发语言·qt
caimouse40 分钟前
Reactos 第1章 概述
c语言·开发语言·架构
.千余1 小时前
【C++】C++继承入门(下):友元、静态成员与菱形继承的底层逻辑
开发语言·c++·笔记·学习·其他
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月10日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
namexingyun1 小时前
拆解Fable 5三重安全护栏:模型路由、蒸馏防护与生物安全分类器的技术原理 - 微元算力(weytoken)
java·人工智能·python·安全·架构·ai编程
小短腿的代码世界1 小时前
行情快照与增量更新引擎:Qt在高频交易数据分发中的核心架构——你的行情推送为什么延迟了500ms?
开发语言·qt·架构
初中就开始混世的大魔王1 小时前
6 Fast DDS-传输层
开发语言·c++·中间件·信息与通信
chenment1 小时前
别再为每个模型单独写一套队列了:用 200 行代码封装多模态统一调用层
人工智能·python·产品
啊森要自信1 小时前
【GUI自动化测试】控件、鼠标键盘操作与多场景自动化
c语言·开发语言·python·adb·ipython