Products
原生态宠物号 2025-01-04 17:06 32
不过这一次的主角不在音乐播放列表里,而是回归的QQ宠物。QQ音乐迎来了改版,
网友们兴冲冲地更新app,用一首歌的时间孵化了它,又给身边朋友们安利了一圈。不过体验了一周之后,大家的普遍感受还是:没内味了。
这只新的QQ宠物,画风与过去两只小企鹅大相径庭,玩法也更像旅行青蛙:能带上你安排的食物和工具,出门听演唱会。而过去的宠物更像一种陪伴关系,你需要喂它吃饭,给它洗澡,它还能提醒你明天要带伞。
QQ宠物界面
在互动性上,暂时还没有出现过去一样,能与好友的宠物一同玩耍的玩法。一周过去了,我QQ宠物榜单上的好友还不足10位。
想找回曾经感动而孵化宠物的人,或许多少会有些失望。而找不回的也远不只是QQ宠物,而是那段纯粹的互联网初体验。
2005年6月,QQ用户们收到了一个弹窗界面,让你选择砸开粉红色的蛋还是蓝色的蛋。许多人在砸开后才知道,颜色代表性别——是GG还是MM。
一只与QQ图标相似的肥企鹅,从此破蛋而出。鼠标符号在它身上点击一次,就能让它开心起来,心情值加10分。虽然它很容易被逗笑,却出了名的“难养”——
早期的宠物,正常情况下饥饿值每分钟会减2点,在线6个小时就需要喂食一次,清洁值每分钟会减2点,每在线3个小时需要洗澡一次。当这两种属性下降到一定程度,它就会生病,甚至死亡。
生病的QQ宠物(动图截自B站:@魔方工作室官方号)
这样的设定,成为了许多人的童年阴影。有一位网友这样描述:看着电脑桌面上一个死神提着镰刀从天而降带走了我的小企鹅,我抱着电脑哭了一下午。
为了躲避死神的镰刀和宠物们难过的眼泪,用户们开始了氪金,这两只企鹅也成为了新的摇钱树。
那一年,QQ同时在线用户突破了1000万,超过了全网网民数量的10分之一。QQ也在那一年探索了更多社交的玩法,此前,QQ的功能更新多是围绕聊天进行。2005年,QQ宠物、QQ空间和QQ音乐面世。QQ空间的任务是抗衡当时正兴起的博客,QQ音乐是衍生的用户服务功能,而QQ宠物的目标,则是占领桌面。
那个时候,但凡认领了QQ宠物,它就会在你打开QQ时一直在电脑桌面上停留。
据初创团队回忆,随着QQ宠物用户的增加,玩家们渴望更多样的养成玩法,希望自己的宠物能上学、打工、冒险、交友乃至结婚生子。 团队在2006年底整合了玩家的意见后,推出了更为丰富的养成方式和一系列小游戏,QQ宠物也从最初设定里简单的“桌面助手”,变为全球首款桌面养成游戏。
动图截自B站:@魔方工作室官方号
更新之后,QQ宠物走到了它的巅峰。2007年8月,QQ宠物在线人数突破160万,这样的巅峰数据还往后维持了一年的时间。
它也为腾讯贡献着不菲的收入。根据网上流出的一份2007年腾讯内部的Q宠用户调研报告,QQ宠物用户的总体付费率高达68%,付费用户平均每月花费的金额为7.8元,在当年已是一个优秀的数字。而翻看05、06、07年的腾讯财报,都有专门的部分讲述QQ宠物对于营收的贡献。
玩家小豆正是在2007年有了自己的QQ宠物。当时还在读四年级的他,为了融入这个“全班都有宠物”的氛围,注册了QQ号,担心“没有人和我结婚”,还注册了两个号,一个养GG一个养MM。
QQ宠物结婚证书(动图截自B站:@魔方工作室官方号)
“当时Q宠社区里很多小游戏特别好玩,我记得有一个叫海盗船的解谜游戏,每周五会开放关卡,我们就每周五聚到一个同学家一起解谜。”没有零花钱的他,也会从两块早餐钱里省下一块,“存到十块钱就去买点卡,五块给GG五块给MM。”
小豆正是彼时QQ宠物的主流用户之一。2009年,时任腾讯互动娱乐QQ宠物产品部总监的张晗劲在一场媒体沙龙说,宠物本来的玩家就是女性和非传统网络游戏的玩家,小孩很多,而在大学生和上班族里,女性占多数。”一到大学阶段,男生用户的网游市场非常大,打什么都有……上班族,这个方面,女性优先,对于他们QQ宠物可能只占很小的空间和时间。”
QQ宠物的繁荣,依托于QQ用户的持续增长,也脱离不了家庭电脑配置低的时代背景。那个年代,大多数家庭电脑硬件配置及网络配置,不能支持内存较大的端游,在网吧玩游戏,是当时更多人的选择。在家庭电脑的使用场景里,QQ宠物这样的轻量级游戏和页游才是主流。
但就在QQ宠物在线人数创辉煌的内部、外部的竞争对手也已崛起。
在腾讯内部,QQ宠物的对手是一系列端游。2008年,《QQ飞车》《QQ炫舞》《穿越火线》相继公测。 《QQ飞车》《穿越火线》分流了一大批小学、初中生玩家,《QQ炫舞》则分流了一批女性玩家。
外部,页游领域也出现了儿童市场的新王者。2007年,时任项目总监的汪海兵出走腾讯,到上海创立了淘米,研发虚拟社区页游《摩尔庄园》。游戏一经上线就取得了巨大的成功,截至2009年底,《摩尔庄园》就吸纳了超过5000万用户。页游平台4399也靠着淘米的《摩尔庄园》《塞尔号》收获了超过四亿的注册用户,十亿元营收。
自此,QQ宠物的用户开始大量流失。在2009年的那场沙龙上,张晗劲并不讳言这一点,同时也表明了QQ宠物接下来的转型计划:一,优化宠物AI,继续占领桌面,但不是骚扰用户,而是满足主人和宠物之间的关系;二、做免费化转型,在新社区里设计各类小游戏,增加游戏币“元宝”的获取途径,降低用户养成难度,以换取玩家对Q宠社区的粘性。
腾讯2009年年报更是写明了QQ宠物的新定位:“就《QQ宠物》而言,我们为提升使用量,将产品过渡到多人社区平台而减少商业化活动,故相关收入减少。我们将对QQ宠物重新定位为一款以低龄青少年为目标的游戏,并预期该产品在日后将带来较少收入。”
小豆偷偷存钱买点卡的日子没有持续太久。他在床垫下藏钱的行为因为妈妈洗了一次床单而彻底暴露。他不再有机会买点卡,QQ宠物也没有成功升级到可以结婚的等级。
但等他2009年上了初一,又有了新的融入集体的方式:玩QQ空间游戏。“大家都玩QQ空间,我第一次接触QQ炫舞这种类型的游戏就是在QQ空间跳舞,它移植了很多游戏形式进去,可以说是小4399了。”
彼时的QQ 空间,已全面转型社交网络,有了说说、日志、相册、留言板、音乐盒等功能。2009年,好友动态已经被放到了空间页面中间,这是“说说”还叫做“心情”的最后一年。QQ 农场让许多用户按捺不住半夜起床偷菜,抢车位的好友排行榜也赛况胶着。
QQ空间2009年页面(图片来自:好奇心日报)
QQ宠物也在这一年推出了多人社区平台,风语广场、夏帕海岸、粉钻雪山等经典场所都在这次改版中出现。社区也像张晗劲说的那样,包含多种类型的小游戏,获取元宝的难度也大大降低。
QQ宠物新社区大地图(图片来自:B站账号@芒果冰OL)
改动在次年还在继续推进:衍生页游《Q宠大乐斗》,与QQ宠物时有互动;第三只QQ宠物“熊熊”诞生,及其对应的女性向虚拟社区《小熊梦工厂》。Q宠产品部也在这一年改组为魔方工作室,还发行了到现在仍有IP影响力的《洛克王国》。
但这些改动,都没能让QQ宠物再创辉煌。推出了《国内网游史》系列的B站UP主芒果冰OL,曾在聊到QQ宠物时分析,其没能打败同期竞品的原因或许有两个——
其一是改动没能满足原先主流付费玩家。虽然QQ宠物有一部分玩家是小孩,但根据07年的那份用研报告的数据,接近90%的付费玩家都是18岁以上的成年人。如此一来,Q宠之前积累的海量用户并没有被平稳转移到新版社区之中,反而让不少嫌玩小游戏太麻烦的成年用户大量流失。
其二,对比竞品《摩尔庄园》、《奥比岛》乃至同门产品《洛克王国》,Q宠在世界观铺陈和讲故事方面存在天然劣势。
《摩尔庄园》创始人将其定义为“可以玩的动画片”的定义下,聘请了优秀的动画团队打造适合儿童观看的动画剧情,QQ宠物相较之下,更像flash游戏大集合。“大家或许会被Q宠社区中的一些有趣的玩法短暂吸引,但却对整个社区缺乏代入感。”芒果冰OL分析道。
《摩尔庄园》 画面(图片来自:交大手机报)
2010年,当QQ宠物还在努力更新自己,适应转型时,划时代的手机Iphone 4在美国发售,随即席卷全球。全世界也由此翻开了网络的全新篇章。许多划时代的变化也在移动端悄悄酝酿。
在2011年这个3G元年,变化集中体现在“双微”上:腾讯推出了新的即时通信app微信,新浪微博的影响力则持续扩大,推出了独立搜索功能,为日后的“热搜”奠定了基础。他们在慢慢地把网友的社交渠道争取到移动端。
随着宽带普及和家用机配置提高,网吧已经不再是游戏玩家们唯一的选择。2011-2012年,广州、上海、沈阳等多地新闻报道,网吧上座率已经持续下滑,高峰期甚至刚刚超过50%。而当玩家可以在宿舍或者家里玩到更丰富的游戏,QQ宠物的时代使命或许也就结束了。
赵哥在2011年“延迟沉迷”于QQ宠物,每天用大量的时间刷任务、赚元宝,对着自己的宠物发呆。但彼时的社区已是冷冷清清。后来,赚得大量元宝的他,以一己之力救活了整个QQ好友列表的宠物,“我告诉了他们,但是他们已经不玩了。”
用户对于虚拟宠物的热情,并没有因为QQ宠物的衰落而消散,新的技术和平台,也让虚拟宠物有了更多元的陪伴。
有的游戏,打破了现实与虚拟的“墙”。2016年7月,任天堂(Nintendo)、口袋妖怪公司和Niantic Labs公司联合开发,推出了现实增强(AR)宠物养成对战类游戏《精灵宝可梦Go》。玩家可以对现实世界中出现的宝可梦进行捕捉、交换和战斗。这款游戏,仅 19天就获得了5000万用户。
《精灵宝可梦Go》宣传片
有的游戏,以“佛系”击中都市繁忙上班族的心。2018年初,《旅行青蛙》凭借其佛系的清流玩法,让诸多玩家争相当起了青蛙的老母亲,帮它收拾出门时的行囊,为他备好招待朋友的食物。未上线多久,该游戏就迅速登上国内苹果应用商店下载榜首。
“陪伴感”甚至已经不局限于宠物,还有纸片人。叠纸于2107年推出的恋爱养成游戏《恋与制作人》,粉丝“入戏”到在三次元里做斥巨资做生日应援,2018年角色周棋洛的生日,就有粉丝包下了时代广场的大屏,白起粉丝更是集资百万投入生日应援中。
上述的“陪伴”,都发生在移动端。2017年,支撑QQ宠物页游的flash都宣告将于三年后关闭,玩家打开浏览器,都常常会被提醒“你需要安装Flash Player6或更高版本”。
2018年6月30日,QQ宠物临近终点。官方公告宣布,《QQ宠物》和《乐斗II》(《Q宠大乐斗》的续集)将于当年9月5日正式关停。
据魔方工作室在B站的视频解释,2018年本不是QQ宠物这款游戏的终点,仅是租房Q宠服务器的房子到期年份。只是,在团队试图迁移服务器时,遭遇了更大的麻烦。
动图截自B站:@魔方工作室官方号
作为全球首款桌面养成类游戏,QQ宠物的成长属于探索中前行,早期的团队并没有经验,导致最开始的搭建体系并不成熟,后端架构上并没有一个系统的框架,很多机器上都混搭着不同的系统模块,大大增加了迁移的难度。
技术的问题加已经无力承担成本,QQ宠物最终只能选择退市。
退市并不意味这是一个失败的产品。如今回看2005年,当年腾讯推出QQ宠物背后的逻辑,到今天仍然适用——借由慢节奏的养成游戏,让用户产生互动和链接,建立对社区的归属感,进而提高品牌在用户心中的形象。在元宇宙概念大火的当下,这种虚拟形象养成还有更大的想象空间。
此次QQ宠物在QQ音乐复活,归根结底也是作为社区衍生功能的一种,满足用户的多元需求。
宠物可以出门听演唱会,回来后用户将获得一个主题歌单
“社交娱乐”一直是TME(腾讯音乐娱乐集团)重要收入来源,收入占比超过70%。今年4月,腾讯PCG高管迎来史上最大规模的调整。原QQ负责人梁柱履新TME的CEO,与现任执行董长彭迦信也不是初次合作。2014年,两人同属于SNG,一同打通了QQ、QQ空间、QQ音乐等多个社交和娱乐平台。
二人再度携手,加强TME在音乐和社交娱乐上的联动也是必然的动作,此次QQ音乐的一系列改版,也是在这一逻辑之下。
只是,如今的我们连听完一首歌的耐心都没有,几秒钟就能“刷”过去,还会有心思陪伴一只小宠物慢慢长大吗?
参考资料:
1、QQ 空间十年了,我们通过 8 个问题重新认识这个依然活跃的社交网络,好奇心日报
2、网游史丨QQ宠物的诞生与没落,芒果冰OL(B站账号:@芒果冰OL)
3、部人员揭秘!当年的QQ宠物为何停止运营?(B站账号:魔方工作室官方号)
4、腾讯张晗劲:QQ宠物完善后可能要免费化,腾讯科技
文 | 符琼尹
编辑 | 赵普通
也有不少小伙伴问过我,怎么打包 Python 程序为 exe 可执行文件,正好今天的实战一起讲解。
用 Python 做个属于自己的宠物桌面,对原理和代码进行了详细讲解,非常适合新手~
(▁▂▃▅▆▇ 源码&文件☞☞☞私❤“求分享” ▇▆▅▃▂▁)
桌面宠物的各种动画效果,可以看作是由一个个GIF动图拼接而成,我们需要准备多组GIF动图来实现桌面宠物的动作切换。
最好选取是白底的GIF动图。
1.2.1 通过pr实现视频转GIF
pr在导出的时候选择动画GIF可以直接导出GIF动图。
当然了想要白底就需要自己用“蒙版”和画笔工具自己抠图。
1.2.2 通过ps实现图片组转GIF
ps会高级一点,首先点击最上方的窗口,再点击时间轴,在下方显示出的时间轴的最右边的加号可以添加你想要添加的图片。图层右边可以选择删除背景。
然后选择最上方的文件,选择导出,选择导出为web所用格式旧版,即可。
1.2.3 百度一下,获取网上现成的GIF资源
1)百度:“制作GIF动图”
2)百度:“GIF动图资源”
或者干脆找个2D游戏素材网站也行,里面有很多角色人物素材在里面。
(▁▂▃▅▆▇ 源码&文件☞☞☞私❤“求分享” ▇▆▅▃▂▁)
项目的目录结构整体如下:main.py为主程序代码。
normal下的GIF图是宠物平常会随机切换的动作GIF图, click下面的GIF图是点击宠物之后的宠物动作的GIF图。
dialog.txt 记录了宠物的对话信息。
tigerIcon.jpg是缩小到托盘后托盘图标的图片。
2.2.1 引用包
os包用于加载文件,sys包用于退出程序,random包用于程序中一些需要调用随机数的操作。其他的三个包则是用于实现桌面宠物的基础。
import os import sys import random from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import *
2.2.2 主代码部分
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_())
2.2.3 代码运行流程
整个运行流程为:
class DesktopPet(QWidget): def __init__(self, parent=None, **kwargs): super(DesktopPet, self).__init__(parent) # 窗体初始化 self.init() # 托盘化初始 self.initPall() # 宠物静态gif图加载 self.initPetImage() # 宠物正常待机,实现随机切换动作 self.petNormalAction()
1、加载显示GIF动图的窗体,通过函数init实现,其代码配置如下:
这几句的作用是对展示宠物的窗体进行一些初步的设置,使得白色GIF图能够去掉背景的白色,将GIF图透明的展示出来。
# 窗体初始化
def init(self):
# 初始化
# 设置窗口属性:窗口无标题栏且固定在最前面
# FrameWindowHint:无边框窗口
# WindowStaysOnTopHint: 窗口总显示在最上面
# SubWindow: 新窗口部件是一个子窗口,而无论窗口部件是否有父窗口部件
# https://blog.csdn.net/kaida1234/article/details/79863146
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)
# setAutoFillBackground(True)表示的是自动填充背景,False为透明背景
self.setAutoFillBackground(False)
# 窗口透明,窗体空间不透明
self.setAttribute(Qt.WA_TranslucentBackground, True)
# 重绘组件、刷新
self.repaint()
2、实现能托盘显示的功能,通过函数initPall实现,其代码配置如下:
主要有下面这几个操作:
(1)读取静态图片资源设置托盘化的图标。
(2)设置托盘化图片点击右键显示的菜单,并对这些菜单的点击操作进行设置。
流程代码如下:
#(▁▂▃▅▆▇ 源码☞☞☞私❤“求分享”自取 ▇▆▅▃▂▁)
# 托盘化设置初始化
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()
其中‘退出’项涉及到的函数代码如下:
# 退出操作,关闭程序
def quit(self):
self.close()
sys.exit()
其中‘显示’项涉及到的函数代码如下:
# 显示宠物
def showwin(self):
# setWindowOpacity()设置窗体的透明度,通过调整窗体透明度实现宠物的展示和隐藏
self.setWindowOpacity(1)
3、宠物静态资源的加载,通过函数initPetImage实现,其代码配置如下:
静态资源的加载主要涉及两个部分,对话框内容的加载和图片内容的加载。
#(▁▂▃▅▆▇ 源码☞☞☞私❤“求分享”自取 ▇▆▅▃▂▁)
# 宠物静态gif图加载
def initPetImage(self):
# 对话框定义
self.talkLabel = QLabel(self)
# 对话框样式设计
self.talkLabel.setStyleSheet("font:15pt '楷体';border-width: 1px;color:blue;")
# 定义显示图片部分
self.image\">
其中我们希望宠物出现的位置是随机的而不是固定的,那么便通过 randomPosition()实现宠物出现位置的随机。
# 宠物随机位置
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)
4、宠物正常待机,实现随机切换动作,对话框通过函数petNormalAction实现,其代码配置如下
这里通过QTimer实现定时操作,到达设置的时间即调用相关的函数。其中condition为标识宠物状态的flag,0为平常状态,1为点击状态,这个状态可按照自己的喜好拓展。talk_condition同理,为标识宠物对话状态的flag。
# 宠物正常待机动作
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()
通过randomAct实现宠物动作的随机切换,通过talk实现对话框内容的切换,其代码如下:
self.pet1和self.dialog在初始化的时候即定义了。这里可以按照自己的喜好进行拓展,用多个if-else if实现多种状态的切换和定义,增加一些喂食,玩耍动作等。
# 随机动作切换
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\">
5、实现能够拖动宠物,通过多个自带函数实现,其代码配置如下:
实现宠物的拖动主要通过三个函数实现,mouserPressEvent负责在鼠标点击判断其是否在宠物窗口上,如果在则将宠物和鼠标的位置绑定,并执行点击改变宠物GIF图和对话框的操作。
mouseMoveEvent实现按下后宠物跟着鼠标移动
mouseReleaseEvent将之前的锁定取消
# 鼠标左键按下时, 宠物将和鼠标位置绑定
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))
6、实现宠物右键点击具有交互功能,通过函数contextMenuEvent实现,其代码配置如下:
退出操作通过 qApp.quit()实现,直接退出相应的QT程序。
隐藏操作则通过self.setWindowOpacity(0)实现,这个可控制窗口的透明度。
# 宠物右键点击交互
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)
7、鼠标移到宠物上的时候显示为闭合的手
# 鼠标移进时调用
def enterEvent(self, event):
# 设置鼠标形状 Qt.ClosedHandCursor 非指向手
self.setCursor(Qt.ClosedHandCursor)
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/79863146
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('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\">
pip install pyinstaller
如果提示黄色提示pip版本问题,照着上面的提示修改即可。
进入打开cmd命令行,进入项目目录,输入命令
pyinstaller -F -w main.py
打包完成后,在生成的dist里面可以看到main.exe文件。
将main.exe放到主目录下就可正常运行。
(▁▂▃▅▆▇ 源码&文件☞☞☞私❤“求分享”自取 ▇▆▅▃▂▁)
Demand feedback