利⽤python写个桌⾯挂件,带⼤家做只桌⾯宠物
转载⾃品略图书馆
导语
前段时间有⼩伙伴留⾔说想让我带⼤家写写桌⾯⼩挂件,今天就满⾜⼀下留过类似⾔的⼩伙伴的请求呗~不过感觉写桌⾯的挂历啥的没意
思,就简单带⼤家做⼀只桌⾯宠物吧~
废话不多说,让我们愉快地开始吧~
开发⼯具
Python版本:3.6.4相关模块:PyQt5模块;以及⼀些Python⾃带的模块。原理简介
既然要写个桌⾯宠物,⾸先当然是要宠物的图⽚素材啦。这⾥我们使⽤的是来⾃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.set paint()
并随机导⼊⼀张宠物图⽚来看看运⾏效果:
# 随机导⼊⼀个宠物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 =
pet_geo.height()) * random.random() ve(width, height)
现在,运⾏我们的程序时,效果是这样⼦的:
好像蛮不错的呢~等等,好像有问题,重新设置了窗⼝属性之后,这玩意咋退出啊?在宠物右上⾓加个×这样的符号⼜好像很奇怪?
别急,我们可以给我们的桌⾯宠物添加⼀个托盘图标,以实现桌⾯宠物程序的退出功能:
# 设置退出选项quit_action = QAction('退出', self, triggered=self.quit)quit_action.setIcon(QIcon(iconpath))ay_icon_menu
= QMenu(ay_icon_menu.addAction(quit_ay_icon =
QSystemTrayIcon(ay_icon.setIcon(QIcon(iconpath))ay_icon.ay_icon_ay_icon.show
效果是这样⼦的:
OK,这样好像有模有样了呢~但是好像还是不太对的样⼦,这宠物每次在桌⾯⽣成的位置是随机的,但是我们却⽆法调整这个宠物的位置,
这显然不合理,作为⼀个桌⾯宠物,你肯定不能在妨碍主⼈⼯作的位置啊!要不我们来写⼀下⿏标按下、移动以及释放时的函数吧,这样就
可以⽤⿏标拖动它了:
'''⿏标左键按下时, 宠物将和⿏标位置绑定'''def mousePressEvent(self, event):if event.button() == Qt.LeftButton:
self.is_follow_mouse = use_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: ve(event.globalPos() - use_drag_pos) event.accept()'''⿏标释放时, 取消绑定'''def mouseReleaseEvent(self, event): self.is_follow_mouse = False self.setCursor(QCursor(Qt.ArrowCursor))
效果如下:
哈哈,越来越像样了呢~最后,作为⼀个活泼的宠物,你不能这么呆板,⼀动也不动吧?好⽍要学会做做表情逗主⼈开⼼吧?OK,我们先来
设置⼀个定时器:
python怎么读取桌面上的文件
# 每隔⼀段时间做个动作self.timer = QTimer()self.t(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
OK,⼤功告成了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。