<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前段時間有小夥伴留言說想讓我帶大家寫寫桌面小掛件,今天就滿足一下留過類似言的小夥伴的請求唄~不過感覺寫桌面的掛曆啥的沒意思,就簡單帶大家做一隻桌面寵物吧~
廢話不多說,讓我們愉快地開始吧~
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.setAttribute(Qt.WA_TranslucentBackground, True) self.repaint()
並隨機匯入一張寵物圖片來看看執行效果:
# 隨機匯入一個寵物 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 = self.geometry() width = (screen_geo.width() - pet_geo.width()) * random.random() height = (screen_geo.height() - pet_geo.height()) * random.random() self.move(width, height)
現在,執行我們的程式時,效果是這樣子的:
好像蠻不錯的呢~等等,好像有問題,重新設定了視窗屬性之後,這玩意咋退出啊?在寵物右上角加個×這樣的符號又好像很奇怪?
別急,我們可以給我們的桌面寵物新增一個托盤圖示,以實現桌面寵物程式的退出功能:
# 設定退出選項 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()
效果是這樣子的:
OK,這樣好像有模有樣了呢~但是好像還是不太對的樣子,這寵物每次在桌面生成的位置是隨機的,但是我們卻無法調整這個寵物的位置,這顯然不合理,作為一個桌面寵物,你肯定不能在妨礙主人工作的位置啊!要不我們來寫一下滑鼠按下、移動以及釋放時的函數吧,這樣就可以用滑鼠拖動它了:
'''滑鼠左鍵按下時, 寵物將和滑鼠位置繫結''' 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))
效果如下:
哈哈,越來越像樣了呢~最後,作為一個活潑的寵物,你不能這麼呆板,一動也不動吧?好歹要學會做做表情逗主人開心吧?OK,我們先來設定一個定時器:
# 每隔一段時間做個動作 self.timer = QTimer() self.timer.timeout.connect(self.randomAct) self.timer.start(500)
定時器每隔一段時間切換一下選中的寵物的圖片,以達到寵物做表情動作的動畫效果(視訊是一幀幀的圖片組成的這種基礎內容就不需要我來科普了吧T_T)。當然,這裡我們必須對圖片進行動作分類(在做同一個動作的圖片屬於同一類),保證寵物做表情動作時的連貫性。具體而言,程式碼實現如下:
'''隨機做一個動作''' 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() '''完成動作的每一幀''' 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
OK,大功告成了~
到此這篇關於用Python製作一個可以聊天的皮卡丘版桌面寵物的文章就介紹到這了,更多相關Python桌面寵物內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45