用Python制作一個可以聊天的皮卡丘版桌面寵物
導(dǎo)語
前段時間有小伙伴留言說想讓我?guī)Т蠹覍憣懽烂嫘旒裉炀蜐M足一下留過類似言的小伙伴的請求唄~不過感覺寫桌面的掛歷啥的沒意思,就簡單帶大家做一只桌面寵物吧~
廢話不多說,讓我們愉快地開始吧~
開發(fā)工具
Python版本:3.6.4
相關(guān)模塊:
PyQt5模塊;
以及一些Python自帶的模塊
原理簡介
既然要寫個桌面寵物,首先當然是要找寵物的圖片素材啦。這里我們使用的是來自shimiji這款手機APP上的寵物圖片素材,例如皮卡丘:

我下了大約60多種寵物的圖片素材供大家選擇:

在相關(guān)文件里都打包一起提供了,所以這里就不分享爬蟲代碼了(我挑選了一下,只要不是我覺得特別丑的,我基本都保留了),別給人家服務(wù)器帶來不必要的壓力。
接下來,我們就可以開始設(shè)計我們的桌面寵物啦。鑒于網(wǎng)上用python寫的桌面掛件基本都是基于tkinter的,為了突出公眾號的與眾不同,這里我們采用PyQt5來實現(xiàn)我們的桌面寵物。
步驟實現(xiàn)
首先,我們來初始化一個桌面寵物的窗口組件:
class DesktopPet(QWidget):
def __init__(self, parent=None, **kwargs):
super(DesktopPet, self).__init__(parent)
self.show()它的效果是這樣子的:

接下來,我們設(shè)置一下窗口的屬性讓更適合作為一個寵物的窗口:
# 初始化 self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint|Qt.SubWindow) self.setAutoFillBackground(False) self.setAttribute(Qt.WA_TranslucentBackground, True) self.repaint()
并隨機導(dǎo)入一張寵物圖片來看看運行效果:
# 隨機導(dǎo)入一個寵物 self.pet_images, iconpath = self.randomLoadPetImages() # 當前顯示的圖片 self.image = QLabel(self) self.setImage(self.pet_images[0][0])
其中隨機導(dǎo)入一個寵物的所有圖片的函數(shù)代碼實現(xiàn)如下:
'''隨機導(dǎo)入一個桌面寵物的所有圖片'''
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當然,我們也希望寵物每次在桌面上出現(xiàn)的位置是隨機的,這樣會更有趣一些:
'''隨機到一個屏幕上的某個位置'''
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)現(xiàn)在,運行我們的程序時,效果是這樣子的:

好像蠻不錯的呢~等等,好像有問題,重新設(shè)置了窗口屬性之后,這玩意咋退出???在寵物右上角加個×這樣的符號又好像很奇怪?
別急,我們可以給我們的桌面寵物添加一個托盤圖標,以實現(xiàn)桌面寵物程序的退出功能:
# 設(shè)置退出選項
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,這樣好像有模有樣了呢~但是好像還是不太對的樣子,這寵物每次在桌面生成的位置是隨機的,但是我們卻無法調(diào)整這個寵物的位置,這顯然不合理,作為一個桌面寵物,你肯定不能在妨礙主人工作的位置??!要不我們來寫一下鼠標按下、移動以及釋放時的函數(shù)吧,這樣就可以用鼠標拖動它了:
'''鼠標左鍵按下時, 寵物將和鼠標位置綁定'''
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))效果如下:

哈哈,越來越像樣了呢~最后,作為一個活潑的寵物,你不能這么呆板,一動也不動吧?好歹要學(xué)會做做表情逗主人開心吧?OK,我們先來設(shè)置一個定時器:
# 每隔一段時間做個動作 self.timer = QTimer() self.timer.timeout.connect(self.randomAct) self.timer.start(500)
定時器每隔一段時間切換一下選中的寵物的圖片,以達到寵物做表情動作的動畫效果(視頻是一幀幀的圖片組成的這種基礎(chǔ)內(nèi)容就不需要我來科普了吧T_T)。當然,這里我們必須對圖片進行動作分類(在做同一個動作的圖片屬于同一類),保證寵物做表情動作時的連貫性。具體而言,代碼實現(xiàn)如下:
'''隨機做一個動作'''
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 += 1OK,大功告成了~
到此這篇關(guān)于用Python制作一個可以聊天的皮卡丘版桌面寵物的文章就介紹到這了,更多相關(guān)Python桌面寵物內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 實現(xiàn)GUI(圖形用戶界面)編程詳解
今天小編就為大家分享一篇python 實現(xiàn)GUI(圖形用戶界面)編程詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
django框架中ajax的使用及避開CSRF 驗證的方式詳解
這篇文章主要介紹了django框架中ajax的使用及避開CSRF 驗證的方式,結(jié)合實例形式分析了Django框架ajax后臺交互與排除驗證csrf相關(guān)操作技巧,需要的朋友可以參考下2019-12-12
Flask?+?MySQL如何實現(xiàn)用戶注冊,登錄和登出的項目實踐
本文主要介紹了Flask?+?MySQL?如何實現(xiàn)用戶注冊,登錄和登出的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
淺談python中的@以及@在tensorflow中的作用說明
這篇文章主要介紹了淺談python中的@以及@在tensorflow中的作用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

