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})

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

相关推荐
2601_9679791236 分钟前
pip在Python中的9个必须知道的用法
python·pip·版本控制·包管理工具·requirements.txt
曲径海盗1 小时前
【Python 学习第 58 天】列表方法
python·学习笔记·编程入门
DeepVisionary1 小时前
Runway开源机器人大模型Praxis-1,推演延迟压到62毫秒
python·自动化
Cooper252 小时前
DDC 命令成功但屏幕不动:用 gamma 表重做亮度映射
python·mac
师夷长技以自愈3 小时前
手搓 AI Agent 第 7 篇:菜做砸了别硬炒——错误分类 + 双账本熔断
人工智能·python
用户956256254293 小时前
15 分钟社媒简报 Agent:我只用了搜索和模型两步
python·api
Dumbness3 小时前
关键词回复里写了 {订单号},群机器人整条消息都炸了
python·微信
调接口的阿光3 小时前
调用对话接口时输出被截断怎么办:先看 finish_reason,再决定是续写一次、缩小范围,还是换成更短的格式(Python)
人工智能·python
Cooper253 小时前
单文件 Flask 跑通微信服务器校验:先跑通再谈工程化
python·flask
Cooper253 小时前
三源热榜去重加 AI 摘要:URL 唯一键踩出的三个坑
前端·python