Python实现桌面皮卡丘宠物:PyQt5打造可交互动态挂件
本文介绍如何使用Python和PyQt5模块制作一款桌面宠物。通过加载皮卡丘等图片素材,利用QTimer实现表情动画,结合鼠标事件处理实现拖拽移动,并添加系统托盘图标以优化退出体验。教程涵盖窗口初始化、随机位置生成及动作分类逻辑,帮助开发者快速构建个性化的桌面互动小工具。
导语
近期有读者留言希望了解桌面挂件的开发方法,本文将满足这一需求。考虑到常规挂历类应用较为单调,这里选择制作一款更具趣味性的桌面宠物程序。
接下来直接进入开发环节。
开发工具
Python版本:3.6.4
相关模块:
PyQt5模块;
以及一些Python自带的模块
原理简介
开发桌面宠物首先需要获取素材。本项目素材来源于shimiji手机APP中的宠物图片,例如皮卡丘形象。

作者整理了约60种宠物图片供用户选择。

所有素材已打包在相关文件中,此处省略爬虫代码以避免给服务器带来不必要的压力。筛选标准主要基于美观度,剔除部分不满意的图片后保留其余素材。
在技术选型上,尽管网上多数Python桌面挂件基于tkinter实现,为体现特色,本项目选用PyQt5来构建桌面宠物。
步骤实现
首先,初始化桌面宠物的窗口组件:
class DesktopPet(QWidget):
def __init__(self, parent=None, **kwargs):
super(DesktopPet, self).__init__(parent)
self.show()其初始效果如下。

随后,配置窗口属性以适配宠物窗口的特殊需求:
# 初始化
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()
# 当前显示的图片
self.image = QLabel(self)
self.setImage(self.pet_images[0][0])其中,随机导入一个宠物所有图片的函数代码实现如下:
'''随机导入一个桌面宠物的所有图片'''
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 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)此时运行程序,效果如下。

效果看似不错,但存在一个问题:重新设置窗口属性后,程序难以退出。在宠物右上角添加关闭符号又显得不协调。
为此,我们可以为桌面宠物添加托盘图标,从而实现程序的正常退出功能:
# 设置退出选项
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()其效果如下。

虽然外观已具雏形,但仍存在不合理之处:宠物随机生成后无法调整位置,可能妨碍用户工作。因此,我们需要编写鼠标按下、移动及释放时的处理函数,以实现拖拽功能:
'''鼠标左键按下时, 宠物将和鼠标位置绑定'''
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))效果如下。

功能日益完善,但作为活泼的宠物,静态展示过于呆板。我们需要让它做出表情以逗乐主人。首先设置一个定时器:
# 每隔一段时间做个动作
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至此,功能开发完成。
到此这篇关于用Python制作一个可以聊天的皮卡丘版桌面宠物的文章就介绍到这了,更多相关Python桌面宠物内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









