最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python制作一個桌面寵物

 更新時間:2022年12月06日 14:48:30   作者:蘿卜大雜燴  
這篇文章主要來和大家分享一個Python寵物桌面小程序,全程都是通過 PyQT 來制作的,對于 Python GUI 感興趣的朋友,千萬不要錯過哦

今天,我們來分享一個寵物桌面小程序,全程都是通過 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)文章

  • Python常用的json標(biāo)準(zhǔn)庫

    Python常用的json標(biāo)準(zhǔn)庫

    今天小編就為大家分享一篇關(guān)于Python常用的json標(biāo)準(zhǔn)庫,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Python接口自動化淺析logging日志原理及模塊操作流程

    Python接口自動化淺析logging日志原理及模塊操作流程

    這篇文章主要為大家介紹了Python接口自動化系列文章淺析logging日志原理及模塊操作流程,文中詳細(xì)說明了為什么需要日志?日志是什么?以及日志用途等基本的原理
    2021-08-08
  • django的安裝和創(chuàng)建應(yīng)用過程詳解

    django的安裝和創(chuàng)建應(yīng)用過程詳解

    這篇文章主要介紹了django的安裝和創(chuàng)建應(yīng)用,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 深入解析Python的Tornado框架中內(nèi)置的模板引擎

    深入解析Python的Tornado框架中內(nèi)置的模板引擎

    模板引擎是Web開發(fā)框架中負(fù)責(zé)前端展示的關(guān)鍵,這里我們就來以實(shí)例深入解析Python的Tornado框架中內(nèi)置的模板引擎,來學(xué)習(xí)如何編寫Tonardo的模板.
    2016-07-07
  • Python中判斷對象是否為空的方法

    Python中判斷對象是否為空的方法

    在Python開發(fā)中,判斷對象是否為“空”是高頻操作,但看似簡單的需求卻暗藏玄機(jī),從None到空容器,從零值到自定義對象的“假值”狀態(tài),不同場景下的“空”需要精準(zhǔn)區(qū)分,本文將系統(tǒng)梳理Python中“空”的判定邏輯,揭示常見誤區(qū),并提供實(shí)用解決方案,需要的朋友可以參考下
    2025-04-04
  • Python可視化函數(shù)plt.scatter詳解

    Python可視化函數(shù)plt.scatter詳解

    這篇文章主要介紹了Python可視化函數(shù)plt.scatter詳解,?關(guān)于matplotlib的scatter函數(shù)有許多活動參數(shù),如果不專門注解,是無法掌握精髓的,本文專門針對scatter的參數(shù)和調(diào)用說起,并配有若干案例,需要的朋友可以參考下
    2023-04-04
  • Python實(shí)現(xiàn)從常規(guī)文檔中提取圖片的方法詳解

    Python實(shí)現(xiàn)從常規(guī)文檔中提取圖片的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)從常規(guī)文檔(Word,PDF,Excel,HTML)中提取圖片的方法,有需要的小伙伴可以參考一下
    2025-03-03
  • python__new__內(nèi)置靜態(tài)方法使用解析

    python__new__內(nèi)置靜態(tài)方法使用解析

    這篇文章主要介紹了python__new__內(nèi)置靜態(tài)方法使用解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Python 利用pandas和mysql-connector獲取Excel數(shù)據(jù)寫入到MySQL數(shù)據(jù)庫

    Python 利用pandas和mysql-connector獲取Excel數(shù)據(jù)寫入到MySQL數(shù)據(jù)庫

    在實(shí)際應(yīng)用中,我們可能需要將Excel表格中的數(shù)據(jù)導(dǎo)入到MySQL數(shù)據(jù)庫中,以便于進(jìn)行進(jìn)一步的數(shù)據(jù)分析和處理,本文將介紹如何使用Python將Excel表格中的數(shù)據(jù)插入到MySQL數(shù)據(jù)庫中,需要的朋友可以參考下
    2023-10-10
  • Python datatime庫語法使用詳解

    Python datatime庫語法使用詳解

    這篇文章主要介紹了Python datatime庫語法使用詳解,datetime模塊用于是date和time模塊的合集,文章圍繞相關(guān)資料展開詳情,感興趣的小伙伴可以擦參考一下
    2022-07-07

最新評論

乐亭县| 石城县| 德令哈市| 平塘县| 武川县| 文登市| 大兴区| 阆中市| 阿荣旗| 顺昌县| 麻栗坡县| 湟源县| 石城县| 闽清县| 富平县| 城市| 湛江市| 新津县| 随州市| 湘潭县| 栖霞市| 辛集市| 佛学| 渝北区| 阳东县| 土默特右旗| 福鼎市| 屯门区| 长海县| 蓬安县| 顺义区| 广昌县| 始兴县| 海宁市| 丰镇市| 高雄县| 绵竹市| 南郑县| 朔州市| 景泰县| 巴东县|