基于Python制作一個桌面寵物
今天,我們來分享一個寵物桌面小程序,全程都是通過 PyQT 來制作的,對于 Python GUI 感興趣的朋友,千萬不要錯過哦!
我們先來看看最終的效果,對于一個小小的娛樂項(xiàng)目來說,還是不錯啦!
本文靈感和部分代碼來源于一篇知乎文章,感興趣的朋友可以訪問如下鏈接[1]
好了,廢話不多說,我直接上干貨,本項(xiàng)目使用 PYQT5 作為編碼框架,如果你對于該框架不是特別熟悉的話,建議先去簡單學(xué)習(xí)一下~
獲取素材圖片
對于素材圖片,我這里也是使用的一款國外的 APP,叫做 shimeji,感興趣的朋友可以下載體驗(yàn)下。
蘿卜哥已經(jīng)下載好了很多素材,如果需要,文末有獲取方式
窗體設(shè)置
首先我們先初始化一個 GUI 窗體
from?PyQt5.QtGui?import?* from?PyQt5.QtCore?import?* from?PyQt5.QtWidgets?import?* from?PyQt5.QtCore?import?Qt class?DesktopPet(QWidget): ????tool_name?=?'桌面寵物' ????def?__init__(self,?parent=None,?**kwargs): ????????super(DesktopPet,?self).__init__(parent) ????????self.index?=?0 ????????self.show()
接下來,由于我們需要只展示圖片素材部分,所以還需要對該 GUI 窗體進(jìn)行屬性設(shè)置
#?含義分別是設(shè)置窗口無邊框,窗口始終處于頂層位置,窗口無按鈕 self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint|Qt.SubWindow)?? self.setAutoFillBackground(False) self.setAttribute(Qt.WA_TranslucentBackground,?True) self.repaint() self.resize(128,?128)
接下來我們導(dǎo)入一個圖片,查看效果
#?導(dǎo)入寵物 image?=?QImage() image.load(os.path.join("resources",?"30",?'shime1.png')) self.image?=?QLabel(self) self.setImage(image) self.show()
效果如下:
可以看到,一個簡易的不會動的寵物已經(jīng)出現(xiàn)了,后面的工作就是把下載好的所有素材全部導(dǎo)入,并隨機(jī)展示即可
隨機(jī)展示寵物圖片
我們先編寫一個導(dǎo)入圖片的函數(shù)
"""導(dǎo)入圖像""" def?loadImage(self,?imagepath): ????image?=?QImage() ????image.load(imagepath) ????return?image
該函數(shù)可以將本地的圖片,導(dǎo)入為 QImage 類型
接下來再編寫一個導(dǎo)入全部圖片素材的函數(shù)
def?loadPetImages(self): ????actions?=?self.action_distribution ????pet_images?=?[] ????for?action?in?actions: ????????pet_images.append( ????????????[self.loadImage(os.path.join("resources",?"30",?'shime'?+?item?+?'.png'))?for?item?in?action]) ????iconpath?=?os.path.join("resources",?"30",?'shime1.png') ????return?pet_images,?iconpath
然后我們在初始化函數(shù)中調(diào)用該函數(shù)即可
#?導(dǎo)入寵物 self.pet_images,?iconpath?=?self.loadPetImages() self.image?=?QLabel(self) self.setImage(self.pet_images[0][0])
這樣,我們就把文件夾30
下面的所有素材圖片都導(dǎo)入了,并且設(shè)置第一張圖片為開始的圖片
添加動作
對于一個桌面寵物來說,沒有都做怎么能行呢
這里的動作分為兩種
- 圖片切換
- 上下移動
我們先來看圖片切換,先定義一個動作函數(shù)
def?randomAct(self): ????self.pet_images,?iconpath?=?self.loadPetImages() ????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
上面的代碼就是隨機(jī)選取素材圖片切換,這樣就達(dá)到了讓寵物“動起來”的效果了
當(dāng)然還需要設(shè)置一個間隔時間,不要使得圖片切換的太快
"""普通動作""" def?commonAction(self): ????#?每隔一段時間做個動作 ????self.timer_common?=?QTimer() ????self.timer_common.timeout.connect(self.randomAct) ????self.timer_common.start(500)
再來看看上下移動
對于上下移動,我們需要計(jì)算當(dāng)前窗體所在位置,然后一段時間給予一定的位移量,此時只需要注意好控制上下邊界,不要讓圖片移動出屏幕
"""上下移動""" def?selfMoveAction(self): ????try: ????????if?self.flag_up: ????????????if?self.pos().y()?-?self.pet_geo_height/2?>?-70: ????????????????self.move(QPoint(self.position.x(),?self.position.y()-5)) ????????????????self.position?=?QPoint(self.position.x(),?self.position.y()-5) ????????????else: ????????????????self.flag_up?=?False ????????elif?not?self.flag_up: ????????????if?self.pos().y()?+?self.pet_geo_height/2?<?700: ????????????????self.move(QPoint(self.position.x(),?self.position.y()?+?50)) ????????????????self.position?=?QPoint(self.position.x(),?self.position.y()?+?50) ????????????else: ????????????????self.flag_up?=?True ????except?Exception?as?e: ????????print(e)
右鍵菜單
對于該桌面寵物,我們還定義了四個右鍵菜單,分別為移動、停止、睡覺,退出
"""右鍵菜單函數(shù)""" def?rightMenu(self): ????self.myMenu?=?QMenu(self) ????self.actionA?=?QAction(QIcon("移動"),?"移動",?self) ????self.actionA.triggered.connect(self.moveUpDown) ????self.actionB?=?QAction(QIcon("停止"),?"停止",?self) ????self.actionB.triggered.connect(self.moveStop) ????self.actionC?=?QAction(QIcon("睡覺"),?"睡覺",?self) ????self.actionC.triggered.connect(self.moveSleep) ????self.actionD?=?QAction(QIcon("退出"),?"退出",?self) ????self.actionD.triggered.connect(self.quit) ????self.myMenu.addAction(self.actionA) ????self.myMenu.addAction(self.actionB) ????self.myMenu.addAction(self.actionC) ????self.myMenu.addAction(self.actionD) ????self.myMenu.popup(QCursor.pos())
對于右鍵菜單綁定的動作函數(shù),定義如下
def?moveUpDown(self): ????self.move_timer.start(100) ????self.up_down?=?True ????self.timer_common.start(500) ????self.timer_sleep.stop()
當(dāng)點(diǎn)擊對應(yīng)的菜單項(xiàng)時,則把對應(yīng)的標(biāo)志位設(shè)置為True
這里還需要注意一點(diǎn)是,在進(jìn)行移動判斷的時候,需要以多線程的方式
"""多線程,判斷是否上下移動""" def?upAndDown(self): ????if?self.up_down: ????????self.stop_threads?=?False ????????t?=?Thread(target=self.do,?args={}) ????????t.start() ????else: ????????self.stop_threads?=?True
OK,以上就是主要代碼,感興趣的小伙伴可以自行嘗試一下哦
到此這篇關(guān)于基于Python制作一個桌面寵物的文章就介紹到這了,更多相關(guān)Python桌面寵物內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
anaconda升級sklearn版本的實(shí)現(xiàn)方法
這篇文章主要介紹了anaconda升級sklearn版本的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02po+selenium+unittest自動化測試項(xiàng)目實(shí)戰(zhàn)
本文主要介紹了po+selenium+unittest自動化測試項(xiàng)目實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12關(guān)于python3.7安裝matplotlib始終無法成功的問題的解決
這篇文章主要介紹了關(guān)于python3.7安裝matplotlib始終無法成功的問題的解決,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-0710行Python代碼實(shí)現(xiàn)Web自動化管控的示例代碼
這篇文章主要介紹了10行Python代碼實(shí)現(xiàn)Web自動化管控的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08python如何實(shí)現(xiàn)異步調(diào)用函數(shù)執(zhí)行
這篇文章主要介紹了python如何實(shí)現(xiàn)異步調(diào)用函數(shù)執(zhí)行,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python實(shí)現(xiàn)從log日志中提取ip的方法【正則提取】
這篇文章主要介紹了Python實(shí)現(xiàn)從log日志中提取ip的方法,涉及Python文件讀取、數(shù)據(jù)遍歷、正則匹配等相關(guān)操作技巧,需要的朋友可以參考下2018-03-03python 實(shí)現(xiàn) hive中類似 lateral view explode的功能示例
這篇文章主要介紹了python 實(shí)現(xiàn) hive中類似 lateral view explode的功能示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05pd.to_datetime中時間object轉(zhuǎn)換datetime實(shí)例
本文主要介紹了pd.to_datetime中時間object轉(zhuǎn)換datetime實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06