嗨害大家好鸭!我是小熊猫❤

昨天企鹅裙里有小伙伴说想让我用Python整个桌面小挂件~

做个日历什么的感觉不够好玩~

今天就来满足一下小伙伴的需求~

简单带大家来整一只桌面宠物吧~
(顺便借口摸鱼哈哈哈哈哈哈)


有什么python相关报错解答自己不会的、或者源码资料/模块安装/女装大佬精通技巧 都可以来这里:(https://jq.qq.com/?_wv=1027&k=2Q3YTfym)或者+V:python10010问我


皮卡丘大家喜欢吗~今天就做个皮卡丘为例哦!!

相关文件

声明:图片素材源于网络,侵歉删。

开发工具

  • Python版本:3.6.4

相关模块:

  • PyQt5模块;

以及一些Python自带的模块。

环境搭建安装

Python并添加到环境变量,pip安装需要的相关模块即可。


原理简介

既然要写个桌面宠物,首先当然是要找宠物的图片素材啦~

这里我们使用的是来自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()

效果是这样子的:

OK,这样好像有模有样了呢~

但是好像还是不太对的样子,

这宠物每次在桌面生成的位置是随机的,

但是我们却无法调整这个宠物的位置,这显然不合理,

作为一个桌面宠物,你肯定不能在妨碍主人工作的位置啊!

要不我们来写一下鼠标按下、移动以及释放时的函数吧,

这样就可以用鼠标拖动它了:

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

效果如下:


哈哈,越来越像样了呢~

最后,作为一个活泼的宠物,你不能这么呆板,一动也不动吧?

好歹要学会做做表情逗主人开心吧?

OK,我们先来设置一个定时器:

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

定时器每隔一段时间切换一下选中的宠物的图片,

以达到宠物做表情动作的动画效果(视频是一帧帧的图片组成的这种基础内容就不需要我来科普了吧T_T)。

当然,这里我们必须对图片进行动作分类(在做同一个动作的图片属于同一类),

保证宠物做表情动作时的连贯性。

具体而言,代码实现如下:

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

OK,大功告成了

完整源代码详见相关文件
最后的效果见效果展示部分吧~

效果展示

在cmd窗口运行如下命令即可:

python DesktopPet.py

效果如下:


本来是动态图的不知为何就是展示不出来只能截图给大家看了!!(有时候是真无语啊)

今天的文章就是这样啦~

我是小熊猫,咱下篇文章再见啦(✿◡‿◡)

【打工人摸鱼系列】python做皮卡丘桌宠,工作都有效率了呢相关推荐

  1. 义正词严的摸鱼 | 摸鱼系列

    一时兴起,想写一些自言自语的东西,原有的系列先暂停一周更新,我努力重构一下笔者的人设试图挽回持续下滑的阅读量. 摸鱼系列,主要写一些自言自语的,轻松的东西. 大家都上班摸鱼的经历,而且有各种各样好玩的 ...

  2. 摸鱼气象Python教案代码分享

    摸鱼气象Python是大气科学领域内的一套有视频讲解,项目实战类的长期更新的教程. 其中涵盖了大量气象领域Python初学者需要用到的编程案例,如: 数据读取.数据处理.数值计算.数据可视化.数据分析 ...

  3. python皮卡丘字符打印代码,python画皮卡丘的代码

    大家好,本文将围绕用python画一只可爱的皮卡丘展开说明,python皮卡丘字符打印代码是一个很多人都想弄明白的事情,想搞清楚python皮卡丘编程代码教程需要先了解以下几个事情. 1.python ...

  4. python的皮卡丘如何写代码,用python画皮卡丘的代码

    python皮卡丘编程代码 import turtledef getPosition(x, y): (x) (y) print(x, y)class Pikachu: def __init__(sel ...

  5. 怎么用python画一个皮卡丘,用python画皮卡丘的代码

    python皮卡丘编程代码 import turtledef getPosition(x, y): (x) (y) print(x, y)class Pikachu: def __init__(sel ...

  6. 【摸鱼系列】如何用Python做一个有趣的Loading彩蛋游戏~

    嗨害大家好鸭!我是小熊猫❤ 不知道大家有没有在摸鱼的时候玩过它~ 这是谷歌流量器中很有名的彩蛋: 当你网络出现问题时,就会出现一个"小恐龙游戏". 当然你如果想要直接进行游戏,可以 ...

  7. 上班摸鱼系列|Python开发命令行斗地主

    前言 大家周末好-最近更新了太多的数据分析内容不知道各位有没有疲劳,今天给大家带来的是如何上班如何高级摸鱼:用Python开发一个命令行斗地主小游戏,利用跑程序的时间来一把斗地主岂不是非常快乐,关键是 ...

  8. 【摸鱼系列】3万张4K壁纸还不够你换的吗?python还可以实现更多采集可能

    嗨害大家好鸭!我是小熊猫❤ 之前有小伙伴说:每天看那么几个壁纸我都腻了 有没有点新奇玩意儿? 我当时 我就笑了~(这不就是妥妥的可以摸鱼了 ~ ) 然后我就在摸鱼的时候给他整了夯巴啦一堆壁纸全打包给他 ...

  9. 黄道吉日摸鱼一下~python将图片转成像素风~

    不得不说今天天气真的很好, 不冷也不热~ 风也吹得很惬意~ 唯一的不好就是我不能出去玩~(呜呜呜发出打工人的哀鸣) 摸鱼摸着摸着-灵感就来了! 如何将一个普通表情包转换成像素风? 接下来就和大家一起用 ...

最新文章

  1. centos7上安装配置tomcat8.5
  2. python将html存为pdf_用Python将HTML转为PDF。
  3. 全新的membership框架Asp.net Identity(1)——.Net membership的历史
  4. 英文简历中的自我评价
  5. windows下安装使用WGET
  6. 基于ggplot2网络可视化(二)
  7. kindle字体设置
  8. JSP中常用的字体类型
  9. 安徽建立“库长制” 千余名库长保粮食安全
  10. 灌区农业水价综合改革解决方案
  11. java 格式化数字(每三位加逗号),保留两位小数。
  12. vant 固定定位不生效
  13. 英文版sketch如何转为中文版?sketch英文转为中文教程!
  14. 在2B和2C之间,还有一个2H(下)
  15. 视频帧率与显示刷新率
  16. Python中办公软件(创建excel)
  17. 我走过山的时候山不说话
  18. 文件共享-ftp、pure-ftpd、sftp共享
  19. Qt程序单元测试学习记录
  20. Paul Graham:创业公司的真正本质是什么

热门文章

  1. swiper插件如何使用?
  2. Android外部唤醒APP跳转指定页面
  3. 一个印章管理员的自白:这些用章、管章套路,得防!
  4. HHM(forward法求观察序列的概率)
  5. 写游戏自动化脚本用哪个语言好
  6. 关于网站被强制跳转博彩棋牌网站的解决方法
  7. 禅与摩托车维修艺术思想哲学
  8. PTA(Basic Level) 1086:就不告诉你(C语言实现)
  9. html中怎么输出函数,获取onclick事件来运行一个函数并在html元素中输出它
  10. SpringCloudStream之消息驱动的微服务