曾经QQ宠物已经停留在记忆里,今天打开QQ,突然想到自己曾经的QQ宠物,好像被自己养死过好几次,毕竟是一个连仙人掌都养不活的人。Sad~~~,于是今天做了一个简单的桌面宠物。
开发工具以及素材准备
Python的开发环境,安装了PyQt5第三方库,同时准备宠物图片,因为只有连续的图片更换,才形成了动作。
#设置宠物动作的全局变量
ACTION\_DISTRIBUTION = [['1', '2', '3'],
['4', '5', '6', '7', '8', '9', '10', '11'],
['12', '13', '14'],
['15', '16', '17'],
['18', '19'],
['20', '21'],
['22'],
['23', '24', '25'],
['26', '27', '28', '29'],
['30', '31', '32', '33'],
['34', '35', '36', '37'],
['38', '39', '40', '41'],
['42', '43', '44', '45', '46']]
PET\_ACTIONS\_MAP={'pet\_22': ACTION\_DISTRIBUTION}
基于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)## 自动填充背景,False则无背景,全白self.setAutoFillBackground(False)## 使得背景透明self.setAttribute(Qt.WA_TranslucentBackground, True)## 重新渲染self.repaint()# 结束初始化 #
窗口已经设置好,导入一张宠物图片
# 随机导入一个宠物self.pet_images, iconpath = self.LoadPetImages()# 当前显示的图片self.image = QLabel(self)self.setImage(self.pet_images[0][0])self.resize(128,128)
其中导入宠物所有的图片的代码实现如下:
'''导入图片'''def loadImage(self, imagepath): image = QImage() image.load(imagepath) return image'''导入所有的宠物图片'''def LoadPetImages(self): actions = PET_ACTIONS_MAP['pet_22'] pet_images=[] for action in actions: pet_images.append([self.loadImage(os.path.join('pet_22','shime'+item+'.png')) for item in action]) iconpath = os.path.join('pet_22','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)
桌面宠物打开之后,每次都用命令行关闭太麻烦,在图片上加上一个'x',也不好看,所以给桌面宠物添加一个托盘图标,以实现桌面宠物程序的退出功能:
# 设置退出选项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 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'''随机做一个动作'''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()
OK,大功告成~~~
还是谢谢大佬,是真大佬,https://github.com/CharlesPikac.