今天,我们来分享一个宠物桌面小程序,全程都是通过 PyQT 来制作的,对于 Python GUI 感兴趣的朋友,千万不要错过哦!
我们先来看看最终的效果,对于一个小小的娱乐项目来说,还是不错啦!
本文灵感和部分代码来源于一篇知乎文章,感兴趣的朋友可以访问如下链接[1]
好了,废话不多说,我直接上干货,本项目使用 PYQT5 作为编码框架,如果你对于该框架不是特别熟悉的话,建议先去简单学习一下~
获取素材图片
对于素材图片,我这里也是使用的一款国外的 APP,叫做 shimeji,感兴趣的朋友可以下载体验下。
萝卜哥已经下载好了很多素材,如果需要,文末有获取方式
窗体设置
展开全文
首先我们先初始化一个 GUI 窗体
fromPyQt5.QtGui import*
fromPyQt5.QtCore import*
fromPyQt5.QtWidgets import*
fromPyQt5.QtCore importQt
classDesktopPet(QWidget):
tool_name = '桌面宠物'
def__init__(self, parent=None, **kwargs):
super(DesktopPet, self).__init__(parent)
self.index = 0
self.show
接下来,由于我们需要只展示图片素材部分,所以还需要对该 GUI 窗体进行属性设置
# 含义分别是设置窗口无边框,窗口始终处于顶层位置,窗口无按钮
self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint|Qt.SubWindow)
self.setAutoFillBackground( False)
self.setAttribute(Qt.WA_TranslucentBackground, True)
self.repaint
self.resize( 128, 128)
接下来我们导入一个图片,查看效果
# 导入宠物
image = QImage
image.load(os.path.join( "resources", "30", 'shime1.png'))
self.image = QLabel(self)
self.setImage(image)
self.show
效果如下:
可以看到,一个简易的不会动的宠物已经出现了,后面的工作就是把下载好的所有素材全部导入,并随机展示即可
随机展示宠物图片
我们先编写一个导入图片的函数
"""导入图像"""
defloadImage(self, imagepath):
image = QImage
image.load(imagepath)
returnimage
该函数可以将本地的图片,导入为 QImage 类型
接下来再编写一个导入全部图片素材的函数
defloadPetImages(self):
actions = self.action_distribution
pet_images = []
foraction inactions:
pet_images.append(
[self.loadImage(os.path.join( "resources", "30", 'shime'+ item + '.png')) foritem inaction])
iconpath = os.path.join( "resources", "30", 'shime1.png')
returnpet_images, iconpath
然后我们在初始化函数中调用该函数即可
# 导入宠物
self.pet_images, iconpath = self.loadPetImages
self.image = QLabel(self)
self.setImage(self.pet_images[ 0][ 0])
这样,我们就把文件夹30下面的所有素材图片都导入了,并且设置第一张图片为开始的图片
添加动作
对于一个桌面宠物来说,没有都做怎么能行呢
这里的动作分为两种
图片切换
上下移动
图片切换
上下移动
我们先来看图片切换,先定义一个动作函数
defrandomAct(self):
self.pet_images, iconpath = self.loadPetImages
ifnotself.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
defrunFrame(self):
ifself.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
上面的代码就是随机选取素材图片切换,这样就达到了让宠物“动起来”的效果了
当然还需要设置一个间隔时间,不要使得图片切换的太快
"""普通动作"""
defcommonAction(self):
# 每隔一段时间做个动作
self.timer_common = QTimer
self.timer_common.timeout.connect(self.randomAct)
self.timer_common.start( 500)
再来看看上下移动
对于上下移动,我们需要计算当前窗体所在位置,然后一段时间给予一定的位移量,此时只需要注意好控制上下边界,不要让图片移动出屏幕
"""上下移动"""
defselfMoveAction(self):
try:
ifself.flag_up:
ifself.pos.y - self.pet_geo_height/ 2 -70:
self.move(QPoint(self.position.x, self.position.y -5))
self.position = QPoint(self.position.x, self.position.y -5)
else:
self.flag_up = False
elifnotself.flag_up:
ifself.pos.y + self.pet_geo_height/ 2 700:
self.move(QPoint(self.position.x, self.position.y + 50))
self.position = QPoint(self.position.x, self.position.y + 50)
else:
self.flag_up = True
exceptException ase:
print(e)
右键菜单
对于该桌面宠物,我们还定义了四个右键菜单,分别为移动、停止、睡觉,退出
"""右键菜单函数"""
defrightMenu(self):
self.myMenu = QMenu(self)
self.actionA = QAction(QIcon( "移动"), "移动", self)
self.actionA.triggered.connect(self.moveUpDown)
self.actionB = QAction(QIcon( "停止"), "停止", self)
self.actionB.triggered.connect(self.moveStop)
self.actionC = QAction(QIcon( "睡觉"), "睡觉", self)
self.actionC.triggered.connect(self.moveSleep)
self.actionD = QAction(QIcon( "退出"), "退出", self)
self.actionD.triggered.connect(self.quit)
self.myMenu.addAction(self.actionA)
self.myMenu.addAction(self.actionB)
self.myMenu.addAction(self.actionC)
self.myMenu.addAction(self.actionD)
self.myMenu.popup(QCursor.pos)
对于右键菜单绑定的动作函数,定义如下
defmoveUpDown(self):
self.move_timer.start( 100)
self.up_down = True
self.timer_common.start( 500)
self.timer_sleep.stop
当点击对应的菜单项时,则把对应的标志位设置为True
这里还需要注意一点是,在进行移动判断的时候,需要以多线程的方式
"""多线程,判断是否上下移动"""
defupAndDown(self):
ifself.up_down:
self.stop_threads = False
t = Thread(target=self.do, args={})
t.start
else:
self.stop_threads = True
OK,以上就是主要代码,感兴趣的小伙伴可以自行尝试一下哦
如果需要素材图片,可以在公众号后台回复“宠物素材”获取,如果对于如何获取所有的素材感兴趣,就点个在看哈,数量足够多,咱们下期就分享!
好了,今天的分享就到这里,喜欢就点个赞吧~
参考资料
[1]
知乎资料: https://zhuanlan.zhihu.com/p/125693970。
入门: 最全的零基础学Python的问题| 零基础学了8个月的Python |实战项目|学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》| 38年NBA最佳球员分析 |从万众期待到口碑扑街!唐探3令人失望| 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏| 九宫格| 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI:会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印!| 一键把html网页保存为pdf!|再见PDF提取收费!| 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换| 制作一款钉钉低价机票提示器!|60行代码做了一个语音壁纸切换器天天看小姐姐!|
年度爆款文案
1).卧槽!Pdf转Word用Python轻松搞定!
2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃
3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密
4).80行代码!用Python做一个哆来A梦分身
5).你必须掌握的20个python代码,短小精悍,用处无穷
6).30个Python奇淫技巧集
7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货
8).再见Python!我要学Go了!2500字深度分析!
9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片
点阅读原文,看B站50个Python实战视频!