首頁 > 軟體

基於Python製作一個桌面寵物

2022-12-07 14:00:40

今天,我們來分享一個寵物桌面小程式,全程都是通過 PyQT 來製作的,對於 Python GUI 感興趣的朋友,千萬不要錯過哦!

我們先來看看最終的效果,對於一個小小的娛樂專案來說,還是不錯啦!

本文靈感和部分程式碼來源於一篇知乎文章,感興趣的朋友可以存取如下連結[1]

好了,廢話不多說,我直接上乾貨,本專案使用 PYQT5 作為編碼框架,如果你對於該框架不是特別熟悉的話,建議先去簡單學習一下~

獲取素材圖片

對於素材圖片,我這裡也是使用的一款國外的 APP,叫做 shimeji,感興趣的朋友可以下載體驗下。

蘿蔔哥已經下載好了很多素材,如果需要,文末有獲取方式

表單設定

首先我們先初始化一個 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 表單進行屬性設定

# 含義分別是設定視窗無邊框,視窗始終處於頂層位置,視窗無按鈕
self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint|Qt.SubWindow)  
self.setAutoFillBackground(False)
self.setAttribute(Qt.WA_TranslucentBackground, True)
self.repaint()
self.resize(128, 128)

接下來我們匯入一個圖片,檢視效果

# 匯入寵物
image = QImage()
image.load(os.path.join("resources", "30", 'shime1.png'))
self.image = QLabel(self)
self.setImage(image)

self.show()

效果如下:

可以看到,一個簡易的不會動的寵物已經出現了,後面的工作就是把下載好的所有素材全部匯入,並隨機展示即可

隨機展示寵物圖片

我們先編寫一個匯入圖片的函數

"""匯入影象"""
def loadImage(self, imagepath):
    image = QImage()
    image.load(imagepath)
    return image

該函數可以將原生的圖片,匯入為 QImage 型別

接下來再編寫一個匯入全部圖片素材的函數

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

然後我們在初始化函數中呼叫該函數即可

# 匯入寵物
self.pet_images, iconpath = self.loadPetImages()
self.image = QLabel(self)
self.setImage(self.pet_images[0][0])

這樣,我們就把資料夾30下面的所有素材圖片都匯入了,並且設定第一張圖片為開始的圖片

新增動作

對於一個桌面寵物來說,沒有都做怎麼能行呢

這裡的動作分為兩種

  • 圖片切換
  • 上下移動

我們先來看圖片切換,先定義一個動作函數

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

上面的程式碼就是隨機選取素材圖片切換,這樣就達到了讓寵物“動起來”的效果了

當然還需要設定一個間隔時間,不要使得圖片切換的太快

"""普通動作"""
def commonAction(self):
    # 每隔一段時間做個動作
    self.timer_common = QTimer()
    self.timer_common.timeout.connect(self.randomAct)
    self.timer_common.start(500)

再來看看上下移動

對於上下移動,我們需要計算當前表單所在位置,然後一段時間給予一定的位移量,此時只需要注意好控制上下邊界,不要讓圖片移動出螢幕

"""上下移動"""
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)

右鍵選單

對於該桌面寵物,我們還定義了四個右鍵選單,分別為移動、停止、睡覺,退出

"""右鍵選單函數"""
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())

對於右鍵選單系結的動作函數,定義如下

def moveUpDown(self):
    self.move_timer.start(100)
    self.up_down = True
    self.timer_common.start(500)
    self.timer_sleep.stop()

當點選對應的選單項時,則把對應的標誌位設定為True

這裡還需要注意一點是,在進行移動判斷的時候,需要以多執行緒的方式

"""多執行緒,判斷是否上下移動"""
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,以上就是主要程式碼,感興趣的小夥伴可以自行嘗試一下哦

到此這篇關於基於Python製作一個桌面寵物的文章就介紹到這了,更多相關Python桌面寵物內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com