摘要
如今人们都追求美化以及娱乐都会下载一些桌面挂件app以此美化桌面,让桌面看起来更好看更好玩更智能。本项目以此背景设计一个简化版挂件APP,实现在桌面上玩宠物的功能,运行改APP后宠物会一直在桌面上活动,可以通过鼠标拖动宠物到桌面其他地方活动。

1.引言
现如今电脑已经在人们的生活中普遍存在,人们的日常工作生活各方面都已经与电脑息息相关,在使用电脑办公的时候不妨添加点乐趣,所以市面上就出现了各种娱乐小游戏以及各种桌面挂件。
本项目以此设计一个桌面宠物。在日常生活中越来越多人开始养宠物,但是养宠物还是有一定的风险,同时也为了满足那些担心风险以及不敢养宠物的人以此设计一个虚拟宠物,可以让人们在线上也可以养宠物,无论线上线下都可以养自己的宠物,也给日常办公的人在忙碌中带来一丝轻松。同时也可以通过养虚拟宠物培养对动物的爱心。通过线上养宠物,了解动物的各种习性还有爱好,方便自己以后更好地养动物
为了让用户不易形成疲劳感,每次运行的时候都会出现不同的宠物,有60多种宠物随机出现,可以通过鼠标拖动宠物到桌面其他地方活动。

2.系统结构
2.1开发工具及相关模块
开发工具:Python版本:3.8
相关模块:PyQt5模块;以及一些Python自带的模块
2.2 PYQT5介绍
PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成。PyQt5本身拥有超过620个类和6000函数及方法。在可以运行于多个平台,包括:Unix, Windows, and Mac OS。

PyQt5的类存在与如下模块当中:
● QtCore
QtCore模块涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及到的 time、文件、目录、数据类型、文本流、链接、mime、线程或进程等对象。
● QtGui
QtGui模块涵盖多种基本图形功能的类; 包括但不限于:窗口集、事件处理、2D图 形、基本的图像和界面 和字体文本。
● QtWidgets
QtWidgets模块包含了一整套UI元素组件,用于建立符合系统风格的classic界面,非常方便,可以在安装时选择是否使用此功能。
● QtMultimedia
QtMultimedia模块包含了一套类库,该类库被用于处理多媒体事件,通过调用API 接口访问摄像头、语音设备、收发消息(radio functionality)等。
● QtBluetooth
QtBluetooth模块包含了处理蓝牙活动的类库,它的功能包括:扫描设备、连接、 交互等行为。
● QtNetwork
QtNetwork模块包含用于网络编程的类库,这组类程序通过提供便捷的TCP/IP 及 UDP 的 c/s 程式码集合,使得基于Qt的网络编程更容易。
● QtPositioning
QtPositioning模块用于获取位置信息,此模块允许使用多种方式达成定位,包括 但不限于:卫星、无线网、文字信息。此应用一般用于网络地图定位系统。
● Enginio
Enginio模块用于构建客户端的应用程式库,用于在运行时访问 Qt Cloud 服务器 托管的应用程序。
● QtWebSockets
QtWebSockets模块包含了一组类程序,用以实现websocket协议。
● QtWebKit
QtWebKit包含了用于实现基于webkit2的网络浏览器的类库。
● QtWebKitWidgets
QtWebKitWidgets模块包含用于基于WebKit1的Web浏览器实现的类,用于基于 QtWidgets的应用程序
● QtXml
QtXml模块包含了用于处理XML的类库,此模块为SAX和DOM API 的实现提供了方 法。
● QtSvg
QtSvg模块通过一组类,为显示矢量图形文件的内容提供了方法。
● QtSql
QtSql模块提供了数据库对象的接口以供使用
● QtTest
QtTest模块包含了可以通过单元测试,以调试PyQt5应用程式的功能。

本项目主要用到QtCore、QtGui、QtWidgets三个模块

2.3程序框架图

2.4程序流程图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200707122554971.png

2.5随机出现的小挂件 —— “宠物”


3.实现代码
3.1首先,我们来初始化一个桌面宠物的窗口组件:

class DesktopPet(QWidget):
def __init__(self, parent=None, **kwargs):
super(DesktopPet, self).__init__(parent)
self.show()


3.2 设置窗口属性

# 初始化
self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint| \
Qt.SubWindow)
self.setAutoFillBackground(False)
self.setAttribute(Qt.WA_TranslucentBackground, True)
self.repaint()

3.3 随机导入一这张图片看看效果

# 随机导入一个宠物
self.pet_images, iconpath = self.randomLoadPetImages()
# 显示当前的图片
self.image = QLabel(self)
self.setImage(self.pet_images[0][0])

3.3随机导入一个宠物的所有图片

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 inaction])
iconpath = os.path.join(cfg.ROOT_DIR, pet_name, 'shime1.png')
return pet_images, iconpath

3.4随机到桌面上一个位置

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)

3.5 添加一个托盘图标,以实现桌面宠物程序的退出

# 设置退出选项
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()


3.6鼠标按下、释放以及拖动

# 鼠标左键按下时, 宠物将和鼠标位置绑定
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))

3.7 设置定时器使宠物动来动去

# 每隔一段时间做一个动作
self.timer = QTimer()
self.timer.timeout.connect(self.randomAct)
self.timer.start(500)

3.8 实现表情动作的连贯性

# 随机做一个动作
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

3.9 完整代码
DesktopPet.py

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 = Falseself.action_images = []self.action_pointer = 0self.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 = Trueself.action_images = random.choice(self.pet_images)self.action_max_len = len(self.action_images)self.action_pointer = 0self.runFrame()'''完成动作的每一帧'''def runFrame(self):if self.action_pointer == self.action_max_len:self.is_running_action = Falseself.action_pointer = 0self.action_max_len = 0self.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 = Trueself.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 = Falseself.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

'''配置文件'''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})

4.实验
运行结果

5.总结与展望
5.1 总结
该项目主要运用到PyQt5模块,只是实现了在桌面上快速切换图片,并没有太大的设计难度,在设计过程中了解到Qt在python中的运用以及对python程序设计的进一步巩固。

5.2 展望
该项目只实现了最简单的功能,还能在此基础上添加各种功能,例如生长升级,喂食洗澡,放养玩耍等功能,实现类似QQ宠物一样的功能。

Python期末作业 ---- 桌面挂件宠物小项目相关推荐

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

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

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

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

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

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

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

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

  5. 利用python写个桌面挂件

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

  6. Python011: Python大作业之移动的小火车动画(四)代码实现

    书接上文:Python010: Python大作业之移动的小火车动画(三)结果显示 0.注意: ​ 该项目使用的库和资源说明如下: pygame 2.0.1 (SDL 2.0.14, Python 3 ...

  7. 【Python案例】零基础手把手带你用Python写个桌面挂件

    嗨嗨,大家好 ~ 我是小圆 大家应该都知道桌面挂件是啥吧,今天外面就来做一只桌面宠物吧 ~ 嘿嘿做一个皮卡丘的 ! 相关文件 声明:图片素材源于网络,侵歉删. 开发工具 Python版本:3.6.4 ...

  8. 分享一个 Python + Django 实现的电商小项目

    编辑:业余草 来源:https://www.xttblog.com/?p=4944 分享一个 Python + Django 实现的电商小项目. 如果自学 Python,那么爬虫和电商项目将是你跳不过 ...

  9. Python008: Python大作业之移动的小火车动画(一)

    Python大作业 1. 要求 使用Python语言,使用的库不限 如下图1的火车轨道 如下图2的火车(2节车厢) 小火车可以在轨道上动态的运行 小火车的大小可调.轨道的大小可调 2. 用到的第三方库 ...

最新文章

  1. hadoop 安全模式
  2. 记录一下提取文件夹中所有文件名字
  3. python爬虫程序实例-10个python爬虫入门实例
  4. boost::adaptors相关的测试程序
  5. QML模块定义qmldir文件
  6. 接口测试到底是什么?如何制造接口数据
  7. 几个颇有创意的网站推广方法(推荐)
  8. 笔记47-徐 数据库引擎中基于行版本控制的隔离级别
  9. Linux下解决高并发socket最大连接数限制,tcp默认1024个连接
  10. 绝对不能错过!计算机视觉Polygon Mesh Processing读书笔记——4微分几何中的曲线
  11. ArcGIS API For JavaScript——空间查询(QueryTask)
  12. 遗传算法原理及应用一(编码、适应度函数与选择算子)
  13. VS2019、VS2017、VS2013产品密钥
  14. 【转】web.xml不同版本的头
  15. 大于/小于/等于 的缩写
  16. runauto 病毒
  17. 随想录(sil、hil、mil测试)
  18. nyoj 题目283 对称排序
  19. JAVA毕业设计web家教管理系统计算机源码+lw文档+系统+调试部署+数据库
  20. git 免用户名密码操作

热门文章

  1. 假设计算机工作频率为5Mhz,医用超声探头-医学影像设备-电子发烧友网站
  2. 云服务器的购买和使用教程(腾讯云为例)
  3. Java迷你Mp3播放器
  4. mysql语句在线生成网站_MYSQL语句生成器
  5. 用友T3普及版安装步骤
  6. 对于IC封装,你了解多少?
  7. waveform波形图(时域图)、spectrum(频谱图)、spectrogram(语谱图)、MFCC
  8. QT的Graphics View柜架
  9. 用知识图谱实现可拓学例子
  10. 1.5 新一代信息技术