python pointer_Python制作桌面宠物(PyQt5使用)

曾经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}

57a14329b123cb045a24d0330dc061ff.png

基于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()# 结束初始化 #

a0e40397b9e0184289a22667625817f0.png

窗口已经设置好,导入一张宠物图片

# 随机导入一个宠物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.

30dc691955ed245d1426677d6cc33871.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值