import os
import sys
import yaml
import random
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class DesktopPet(QWidget):
def __init__(self, parent=None, **kwargs):
super(DesktopPet, self).__init__(parent)
# 参数初始化
self.config = None
with open("./config/config.yaml",'r',encoding="utf-8") as f:
self.config = yaml.safe_load(f.read())
self.box_size = QSize(self.config['box']['width'], self.config['box']['height'])
# 窗体初始化
self.init()
# 托盘化初始
self.initPall()
# 宠物静态gif图加载
self.initPetImage()
# 宠物正常待机,实现随机切换动作
self.petNormalAction()
# 窗体初始化
def init(self):
# 初始化
# 设置窗口属性:窗口无标题栏且固定在最前面
# FrameWindowHint:无边框窗口
# WindowStaysOnTopHint: 窗口总显示在最上面
# SubWindow: 新窗口部件是一个子窗口,而无论窗口部件是否有父窗口部件
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)
# setAutoFillBackground(True)表示的是自动填充背景,False为透明背景
self.setAutoFillBackground(False)
# 窗口透明,窗体空间不透明
self.setAttribute(Qt.WA_TranslucentBackground, True)
# 重绘组件、刷新
self.repaint()
# 托盘化设置初始化
def initPall(self):
# 导入准备在托盘化显示上使用的图标
icons = os.path.join(self.config['tiger']['icon'])
# 设置右键显示最小化的菜单项
# 菜单项退出,点击后调用quit函数
quit_action = QAction('退出', self, triggered=self.quit)
# 设置这个点击选项的图片
quit_action.setIcon(QIcon(icons))
# 菜单项显示,点击后调用showing函数
showing = QAction(u'显示', self, triggered=self.showwin)
# 新建一个菜单项控件
self.tray_icon_menu = QMenu(self)
# 在菜单栏添加一个无子菜单的菜单项‘退出’
self.tray_icon_menu.addAction(quit_action)
# 在菜单栏添加一个无子菜单的菜单项‘显示’
self.tray_icon_menu.addAction(showing)
# QSystemTrayIcon类为应用程序在系统托盘中提供一个图标
self.tray_icon = QSystemTrayIcon(self)
# 设置托盘化图标
self.tray_icon.setIcon(QIcon(icons))
# 设置托盘化菜单项
self.tray_icon.setContextMenu(self.tray_icon_menu)
# 展示
self.tray_icon.show()
# 宠物静态gif图加载
def initPetImage(self):
# 对话框定义
self.talkLabel = QLabel(self)
# 对话框样式设计
self.talkLabel.setStyleSheet("font:15pt '楷体';border-width: 1px;color:blue;")
self.pet1 = []
for i in os.listdir(self.config['normal']['dir']):
self.pet1.append(self.config['normal']['dir']+"/"+ i)
# 定义显示图片部分
self.image = QLabel(self)
# QMovie是一个可以存放动态视频的类,一般是配合QLabel使用的,可以用来存放GIF动态图
self.movie = QMovie(self.pet1[0])
# 设置标签大小
self.movie.setScaledSize(self.box_size)
self.image.move(0,20)
# 将Qmovie在定义的image中显示
self.image.setMovie(self.movie)
self.movie.start()
self.resize(1024, 1024)
# 调用自定义的randomPosition,会使得宠物出现位置随机
self.randomPosition()
# 展示
self.show()
# 以\n 即换行符为分隔符,分割放进dialog中
self.dialog = self.config['normal']['text']
# 宠物正常待机动作
def petNormalAction(self):
# 每隔一段时间做个动作
# 定时器设置
self.timer = QTimer()
# 时间到了自动执行
self.timer.timeout.connect(self.randomAct)
# 动作时间切换设置
self.timer.start(self.config['timer']['time'] * 1000)
# 宠物状态设置为正常
self.condition = 0
# 每隔一段时间切换对话
self.talkTimer = QTimer()
self.talkTimer.timeout.connect(self.talk)
self.talkTimer.start(self.config['timer']['time'] * 1000)
# 对话状态设置为常态
self.talk_condition = 0
# 宠物对话框
self.talk()
# 随机动作切换
def randomAct(self):
# condition记录宠物状态,宠物状态为0时,代表正常待机
if not self.condition:
# 随机选择装载在pet1里面的gif图进行展示,实现随机切换
self.movie = QMovie(random.choice(self.pet1))
# 宠物大小
self.movie.setScaledSize(self.box_size)
# 将动画添加到label中
self.image.setMovie(self.movie)
# 开始播放动画
self.movie.start()
# condition不为0,转为切换特有的动作,实现宠物的点击反馈
# 这里可以通过else-if语句往下拓展做更多的交互功能
else:
# 读取特殊状态图片路径
self.movie = QMovie(self.config['click']['dir'])
# 宠物大小
self.movie.setScaledSize(self.box_size)
# 将动画添加到label中
self.image.setMovie(self.movie)
# 开始播放动画
self.movie.start()
# 宠物状态设置为正常待机
self.condition = 0
self.talk_condition = 0
# 宠物对话框行为处理
def talk(self):
if not self.talk_condition:
# talk_condition为0则选取加载在dialog中的语句
self.talkLabel.setText(random.choice(self.dialog))
# 设置样式
self.talkLabel.setStyleSheet(
"font:" + self.config['text']['font']['weight'] + ";"
"font:" + self.config['text']['font']['size'] + " '" +self.config['text']['font']['font'] + "';"
"color:" + self.config['text']['color'] + ";"
"background-color: white"
"url(:/)"
)
# 根据内容自适应大小
self.talkLabel.adjustSize()
else:
# talk_condition为1显示为别点我,这里同样可以通过if-else-if来拓展对应的行为
self.talkLabel.setText(self.config['click']['text'])
self.talkLabel.setStyleSheet(
"font:"+self.config['text']['font']['weight']+";"
"font:"+self.config['text']['font']['size']+" '"+self.config['text']['font']['font']+"';"
"color:"+self.config['text']['color']+";"
"background-color: white"
"url(:/)"
)
self.talkLabel.adjustSize()
# 设置为正常状态
self.talk_condition = 0
# 退出操作,关闭程序
def quit(self):
self.close()
sys.exit()
# 显示宠物
def showwin(self):
# setWindowOpacity()设置窗体的透明度,通过调整窗体透明度实现宠物的展示和隐藏
self.setWindowOpacity(1)
# 宠物随机位置
def randomPosition(self):
# screenGeometry()函数提供有关可用屏幕几何的信息
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, h
没有合适的资源?快使用搜索试试~ 我知道了~
python桌面动画挂件
共9个文件
gif:5个
jpg:1个
yaml:1个
需积分: 25 3 下载量 135 浏览量
2023-03-02
13:19:03
上传
评论
收藏 1.03MB ZIP 举报
温馨提示
类似gif桌面动态挂件,桌面宠物,可自行配置图片,以及文字
资源推荐
资源详情
资源评论
收起资源包目录
桌面宠物.zip (9个子文件)
normal
normal3.gif 183KB
normal4.gif 170KB
normal1.gif 255KB
normal2.gif 217KB
click
click.gif 59KB
main.py 11KB
tigerIcon.ico 135KB
tigerIcon.jpg 116KB
config
config.yaml 576B
共 9 条
- 1
资源评论
迷茫的程序员.
- 粉丝: 421
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功