开发者

基于Python制作一个桌面宠物

开发者 https://www.devze.com 2022-12-07 09:23 出处:网络 作者: 萝卜大杂烩
目录获取素材图片窗体设置随机展示宠物图片添加动作右键菜单今天,我们来分享一个宠物桌面小程序,全程都是通过 PyQT 来制作的,对于 python GUI 感兴趣的朋友,千万不要错过哦!
目录
  • 获取素材图片
  • 窗体设置
  • 随机展示宠物图片
  • 添加动作
  • 右键菜单

今天,我们来分享一个宠物桌面小程序,全程都是通过 PyQT 来制作的,对于 python GUI 感兴趣的朋友,千万不要错过哦!

我们先来看看最终的效果,对于一个小小的娱乐项目来说,还是不错啦!

基于Python制作一个桌面宠物

本文灵感和部分代码来源于一篇知乎文章,感兴趣的朋友可以访问如下链接[1]

好了,废话不多说,我直接上干货,本项目使用 PYQT5 作为编码框架,如果你对于该框架不是特别熟悉的话,建议先去简单学习一下~

获取素材图片

对于素材图片,我这里也是使用的一款国外的 APP,叫做 shimeji,感兴趣的朋友可以下载体验下。

基于Python制作一个桌面宠物

萝卜哥已经下载好了很多素材,如果需要,文末有获取方式

窗体设置

首先我们先初始化一个 GUI 窗体

fromPyQt5.QtGuiimport*
fromPyQt5.QtCoreimport*
fromPyQt5.QtWidgetsimport*
fromPyQt5.QtCoreimportQt


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()

效果如下:

基于Python制作一个桌面宠物

可以看到,一个简易的不会动的宠物已经出现了,后面的工作就是把下载好的所有素材全部导入,并随机展示即可编程

随机展示宠物图片

我们先编写一个导入图片的函数

"""导入图像"""
defloadImage(self,imagepath):
image=QImage()
image.load(imagepath)
returnimage

该函数可以将本地的图片,导入为 QImage 类型

接下来再编写一个导入全部图片素材的函数

defloadPetImages(self):
actions=self.action_distribution
pet_images=[]
foractioninactions:
pet_images.append(
[self.loadImage(os.path.join("resources","30",'shime'+item+'.png'))foriteminaction])
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
exceptExceptionase:
print(e)

右键菜单

对于该桌面宠物,我们还定义了四个右键菜单,分别为移动、停止、睡觉,退出

"""右键菜单函数"""
defrightMenu(self):
self.myMenu=QMenu(self)
self.actionA=QAction(QIcon("移动"),"移动",self)
self.actionA.triggered.connecthttp://www.devze.com(self.moveUpDown)
self.actionB=QAction(QIcon("停止"),"停止",self)
self.actionB.triggered.connect(self.moveStop)
sandroidelf.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.addActi开发者_C开发on(self.actionC)
self.myMenu.addAction(self.actionD)
self.myMenu.popup(QCursor.pos())

对于右键菜单绑定的动作函数,定义如下

defmoveUpDown(self):
self.move_timer.startjavascript(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,以上就是主要代码,感兴趣的小伙伴可以自行尝试一下哦

到此这篇关于基于Python制作一个桌面宠物的文章就介绍到这了,更多相关Python桌面宠物内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

0

精彩评论

暂无评论...
验证码 换一张
取 消