import os
import sys
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.init()# 托盘化初始self.initPall()# 宠物静态gif图加载self.initPetImage()# 宠物正常待机,实现随机切换动作self.petNormalAction()# 窗体初始化def init(self):# 初始化# 设置窗口属性:窗口无标题栏且固定在最前面# FrameWindowHint:无边框窗口# WindowStaysOnTopHint: 窗口总显示在最上面# SubWindow: 新窗口部件是一个子窗口,而无论窗口部件是否有父窗口部件# https://blog.csdn.net/kaida1234/article/details/79863146self.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('tigerIcon.jpg')# 设置右键显示最小化的菜单项# 菜单项退出,点击后调用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.image = QLabel(self)# QMovie是一个可以存放动态视频的类,一般是配合QLabel使用的,可以用来存放GIF动态图self.movie = QMovie("normal/normal1.gif")# 设置标签大小self.movie.setScaledSize(QSize(200, 200))# 将Qmovie在定义的image中显示self.image.setMovie(self.movie)self.movie.start()self.resize(1024, 1024)# 调用自定义的randomPosition,会使得宠物出现位置随机self.randomPosition()# 展示self.show()# https://new.qq.com/rain/a/20211014a002rs00# 将宠物正常待机状态的动图放入pet1中self.pet1 = []for i in os.listdir("normal"):self.pet1.append("normal/" + i)# 将宠物正常待机状态的对话放入pet2中self.dialog = []# 读取目录下dialog文件with open("dialog.txt", "r") as f:text = f.read()# 以\n 即换行符为分隔符,分割放进dialog中self.dialog = text.split("\n")# 宠物正常待机动作def petNormalAction(self):# 每隔一段时间做个动作# 定时器设置self.timer = QTimer()# 时间到了自动执行self.timer.timeout.connect(self.randomAct)# 动作时间切换设置self.timer.start(3000)# 宠物状态设置为正常self.condition = 0# 每隔一段时间切换对话self.talkTimer = QTimer()self.talkTimer.timeout.connect(self.talk)self.talkTimer.start(3000)# 对话状态设置为常态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(QSize(200, 200))# 将动画添加到label中self.image.setMovie(self.movie)# 开始播放动画self.movie.start()# condition不为0,转为切换特有的动作,实现宠物的点击反馈# 这里可以通过else-if语句往下拓展做更多的交互功能else:# 读取特殊状态图片路径self.movie = QMovie("./click/click.gif")# 宠物大小self.movie.setScaledSize(QSize(200, 200))# 将动画添加到label中self.image.setMovie(self.movie)# 开始播放动画self.movie.start()# 宠物状态设置为正常待机self.condition = 0self.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: bold;""font:25pt '楷体';""color:white;""background-color: white""url(:/)")# 根据内容自适应大小self.talkLabel.adjustSize()else:# talk_condition为1显示为别点我,这里同样可以通过if-else-if来拓展对应的行为self.talkLabel.setText("别点我")self.talkLabel.setStyleSheet("font: bold;""font:25pt '楷体';""color:white;""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, height)# 鼠标左键按下时, 宠物将和鼠标位置绑定def mousePressEvent(self, event):# 更改宠物状态为点击self.condition = 1# 更改宠物对话状态self.talk_condition = 1# 即可调用对话状态改变self.talk()# 即刻加载宠物点击动画self.randomAct()if event.button() == Qt.LeftButton:self.is_follow_mouse = True# globalPos() 事件触发点相对于桌面的位置# pos() 程序相对于桌面左上角的位置,实际是窗口的左上角坐标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 enterEvent(self, event):# 设置鼠标形状 Qt.ClosedHandCursor   非指向手self.setCursor(Qt.ClosedHandCursor)# 宠物右键点击交互def contextMenuEvent(self, event):# 定义菜单menu = QMenu(self)# 定义菜单项quitAction = menu.addAction("退出")hide = menu.addAction("隐藏")# 使用exec_()方法显示菜单。从鼠标右键事件对象中获得当前坐标。mapToGlobal()方法把当前组件的相对坐标转换为窗口(window)的绝对坐标。action = menu.exec_(self.mapToGlobal(event.pos()))# 点击事件为退出if action == quitAction:qApp.quit()# 点击事件为隐藏if action == hide:# 通过设置透明度方式隐藏宠物self.setWindowOpacity(0)if __name__ == '__main__':# 创建了一个QApplication对象,对象名为app,带两个参数argc,argv# 所有的PyQt5应用必须创建一个应用(Application)对象。sys.argv参数是一个来自命令行的参数列表。app = QApplication(sys.argv)# 窗口组件初始化pet = DesktopPet()# 1. 进入时间循环;# 2. wait,直到响应app可能的输入;# 3. QT接收和处理用户及系统交代的事件(消息),并传递到各个窗口;# 4. 程序遇到exit()退出时,机会返回exec()的值。sys.exit(app.exec_())

桌面宠物python相关推荐

  1. 用Python写个桌面挂件,手把手带你做只桌面宠物~

    导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~ 皮卡丘大家喜欢吗~今天就由做个皮卡丘为 ...

  2. 桌面宠物 ① 通过python制作属于自己的桌面宠物

    一.桌面宠物素材 1.1 需要准备什么素材 桌面宠物的各种动画效果,可以看作是由一个个GIF动图拼接而成,我们需要准备多组GIF动图来实现桌面宠物的动作切换. 最好选取是白底的GIF动图. 1.2 介 ...

  3. Python实现桌面宠物

    基于PyQt5 import os import cfg import sys import random from PyQt5.QtGui import * from PyQt5.QtCore im ...

  4. python给女友一个小惊喜——桌面宠物【DIY版】

    嗨害大家好鸭!我是小熊猫❤ 这不是小别胜新欢嘛~ 所以懂得都懂~ 这次给她准备了一些小惊喜 做为程序员,我也只会这个啦(●'◡'●) 开发工具 Python版本:3.6.4 相关模块: PyQt5模块 ...

  5. python桌面宠物_如何从零开始制作智能桌宠?

    作者 | 李秋键 责编 | maozz 引言:是否还记得曾经风靡全国的QQ宠物呢,那个又调皮又可爱的QQ企鹅,偶尔还会生病撒娇,需要培养的虚拟宠物,你是否还记得它的样子呢.它是腾讯公司推出的第一款QQ ...

  6. 用python写个桌面挂件 | 手把手带大家做只桌面宠物

    既然要写个桌面宠物,首先当然是要找宠物的图片素材啦.这里我们使用的是来自shimiji这款手机APP上的宠物图片素材,例如皮卡丘: 我下了大约60多种宠物的图片素材供大家选择: 在相关文件里都打包一起 ...

  7. 利用python写个桌面挂件,带大家做只桌面宠物

    转载自品略图书馆 http://www.pinlue.com/article/2020/05/2516/2110606798446.html 导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今 ...

  8. 用Python实现自制桌面宠物,变出一个桌面小挂件

    前言 就喜欢自己自定义一些小玩意,今天就来分享一些制作桌面宠物的素材,还有代码 相关文件 声明:图片素材源于网络,侵歉删. 开发工具 Python版本:3.6.4 相关模块: PyQt5模块: 以及一 ...

  9. python桌面宠物模块_利用python写个桌面挂件 | 手把手带大家做只桌面宠物呗

    导语 前段时间有小伙伴留言说想让我带大家写写桌面小挂件,今天就满足一下留过类似言的小伙伴的请求呗~不过感觉写桌面的挂历啥的没意思,就简单带大家做一只桌面宠物吧~ 废话不多说,让我们愉快地开始吧~ 开发 ...

最新文章

  1. 样条之埃尔米特(Hermite)插值函数
  2. Android Nine-patch
  3. solaris linux nfs,solaris 10 nfs服务配置
  4. VK Cup 2018 Round 2: B. Three-level Laser(二分)
  5. 4G无线预付费电表系统设计及其应用
  6. 北京理工大学小学期乐学 t23树上统计
  7. RS232串口线接法与线芯引脚定义
  8. Photoshop教程_PS渐变工具找不到,怎样导入ps渐变样式?ps渐变使用教程
  9. 电脑桌面壁纸的尺寸分类
  10. Android内部存储和外部存储以及缓存清理和内存清理!
  11. 怎么逼自己 成为一个上进的人
  12. 解决IDEA启动失败 Improperly specified VM option...问题
  13. 走进科学之内存插槽插满不识别
  14. 东北大学C语言课程题库题解专栏目录
  15. VirtualBox无法安装增强工具-共享复制粘贴功能
  16. EasyExcel设置表格样式
  17. 计算机中桌面位置更改,如何更改桌面文件路径 电脑桌面优化技巧
  18. mysql建表及DML语句
  19. python 字典代码_python中的字典用法大全的代码
  20. Spring的注解@Bean

热门文章

  1. LeetCode--剑指offer 1137题 第 N 个泰波那契数
  2. 习题4-8 特别困的学生(Extraordinarily Tired Students,ACM/ICPC Xi'an 2006,UVa12108)
  3. C语言#error预处理
  4. 工厂车间看板的使用规则,类别和作用
  5. 【华为云分享】软件工程的迷途与沉思
  6. git 工作流的使用_用塔增压您的git流
  7. 基于C51的DHT11(温湿度传感器)编程(详解)
  8. 《科学伦理与学术规范》 课后习题_答案 2022春季
  9. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛——J.最大值【KMP next数组】【暴力(数据太水了!)】
  10. 《微积分:一元函数微分学》——判断极值的三个充要条件