国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

桌面寵物 ① 通過python制作屬于自己的桌面寵物

這篇具有很好參考價值的文章主要介紹了桌面寵物 ① 通過python制作屬于自己的桌面寵物。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、桌面寵物素材

1.1 需要準備什么素材

????????桌面寵物的各種動畫效果,可以看作是由一個個GIF動圖拼接而成,我們需要準備多組GIF動圖來實現(xiàn)桌面寵物的動作切換。

好用的桌面寵物gif,python,桌面寵物

????????最好選取是白底的GIF動圖。

1.2 介紹幾種獲得GIF動圖的方式

1.2.1 通過pr實現(xiàn)視頻轉GIF

好用的桌面寵物gif,python,桌面寵物

?

????????pr在導出的時候選擇動畫GIF可以直接導出GIF動圖。

????????當然了想要白底就需要自已用“蒙版”和畫筆工具自己摳圖了。

1.2.2 通過ps實現(xiàn)圖片組轉GIF

????????ps會高級一點,首先點擊最上方的窗口,再點擊時間軸,在下方顯示出的時間軸的最右邊的加號可以添加你想要添加的圖片。圖層右邊可以選擇刪除背景。

好用的桌面寵物gif,python,桌面寵物

????????然后選擇最上方的文件,選擇導出,選擇導出為web所用格式舊版,即可

好用的桌面寵物gif,python,桌面寵物

?

好用的桌面寵物gif,python,桌面寵物

1.2.3 百度一下,獲取網(wǎng)上現(xiàn)成的GIF資源

① 百度:“制作GIF動圖”

② 百度????“GIF動圖資源”

你想要的角色人物素材都在這里!最實用的2d游戲素材! - 知乎

二、python實現(xiàn)代碼

好用的桌面寵物gif,python,桌面寵物

?

2.1 目錄結構

????????項目的目錄結構整體如下:main.py為主程序代碼。

好用的桌面寵物gif,python,桌面寵物

?

????????normal下的GIF圖是寵物平常會隨機切換的動作GIF圖,?click下面的GIF圖是點擊寵物之后的寵物動作的GIF圖

好用的桌面寵物gif,python,桌面寵物

?

????????dialog.txt 記錄了寵物的對話信息

好用的桌面寵物gif,python,桌面寵物

?

?????????tigerIcon.jpg是縮小到托盤后托盤圖標的圖片

好用的桌面寵物gif,python,桌面寵物

?

2.2 實現(xiàn)代碼

2.2.1 引用包

????????os包用于加載文件,sys包用于退出程序,random包用于程序中一些需要調(diào)用隨機數(shù)的操作。其他的三個包則是用于實現(xiàn)桌面寵物的基礎。

import os
import sys
import random
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

2.2.2 主代碼部分

if __name__ == '__main__':
    # 創(chuàng)建了一個QApplication對象,對象名為app,帶兩個參數(shù)argc,argv
    # 所有的PyQt5應用必須創(chuàng)建一個應用(Application)對象。sys.argv參數(shù)是一個來自命令行的參數(shù)列表。
    app = QApplication(sys.argv)
    # 窗口組件初始化
    pet = DesktopPet()
    # 1. 進入時間循環(huán);
    # 2. wait,直到響應app可能的輸入;
    # 3. QT接收和處理用戶及系統(tǒng)交代的事件(消息),并傳遞到各個窗口;
    # 4. 程序遇到exit()退出時,機會返回exec()的值。
    sys.exit(app.exec_())

2.2.3 代碼運行流程

整個運行流程為:

(1)通過self.init():實現(xiàn)窗體的初始化,寵物的GIF圖在這個窗體中播放。

(2)通過self.initPall():配置托盤化

(3)通過self.initPetImage():將寵物的靜態(tài)GIF資源,包括對話和GIF動圖進行加載

(4)通過self.petNormalAction():實現(xiàn)寵物隨機切換動作和語句的功能

class DesktopPet(QWidget):
    def __init__(self, parent=None, **kwargs):
        super(DesktopPet, self).__init__(parent)
        # 窗體初始化
        self.init()
        # 托盤化初始
        self.initPall()
        # 寵物靜態(tài)gif圖加載
        self.initPetImage()
        # 寵物正常待機,實現(xiàn)隨機切換動作
        self.petNormalAction()

① 加載顯示GIF動圖的窗體,通過函數(shù)init實現(xiàn),其代碼配置如下:

????????這幾句的作用是對展示寵物的窗體進行一些初步的設置,使得白色GIF圖能夠去掉背景的白色,將GIF圖透明的展示出來

    # 窗體初始化
    def init(self):
        # 初始化
        # 設置窗口屬性:窗口無標題欄且固定在最前面
        # FrameWindowHint:無邊框窗口
        # WindowStaysOnTopHint: 窗口總顯示在最上面
        # SubWindow: 新窗口部件是一個子窗口,而無論窗口部件是否有父窗口部件
        # https://blog.csdn.net/kaida1234/article/details/79863146
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)
        # setAutoFillBackground(True)表示的是自動填充背景,False為透明背景
        self.setAutoFillBackground(False)
        # 窗口透明,窗體空間不透明
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        # 重繪組件、刷新
        self.repaint()

② 實現(xiàn)能托盤顯示的功能,通過函數(shù)initPall實現(xiàn),其代碼配置如下:

????????主要有下面這幾個操作:

? ? ? ? (1)讀取靜態(tài)圖片資源設置托盤化的圖標

好用的桌面寵物gif,python,桌面寵物

?

? ? ? ? ?(2)設置托盤化圖片點擊右鍵顯示的菜單,并對這些菜單的點擊操作進行設置

好用的桌面寵物gif,python,桌面寵物

?

流程代碼如下:?

 # 托盤化設置初始化
    def initPall(self):
        # 導入準備在托盤化顯示上使用的圖標
        icons = os.path.join('tigerIcon.jpg')
        # 設置右鍵顯示最小化的菜單項
        # 菜單項退出,點擊后調(diào)用quit函數(shù)
        quit_action = QAction('退出', self, triggered=self.quit)
        # 設置這個點擊選項的圖片
        quit_action.setIcon(QIcon(icons))
        # 菜單項顯示,點擊后調(diào)用showing函數(shù)
        showing = QAction(u'顯示', self, triggered=self.showwin)
        # 新建一個菜單項控件
        self.tray_icon_menu = QMenu(self)
        # 在菜單欄添加一個無子菜單的菜單項‘退出’
        self.tray_icon_menu.addAction(quit_action)
        # 在菜單欄添加一個無子菜單的菜單項‘顯示’
        self.tray_icon_menu.addAction(showing)
        # QSystemTrayIcon類為應用程序在系統(tǒng)托盤中提供一個圖標
        self.tray_icon = QSystemTrayIcon(self)
        # 設置托盤化圖標
        self.tray_icon.setIcon(QIcon(icons))
        # 設置托盤化菜單項
        self.tray_icon.setContextMenu(self.tray_icon_menu)
        # 展示
        self.tray_icon.show()

其中‘退出’項涉及到的函數(shù)代碼如下:

    # 退出操作,關閉程序
    def quit(self):
        self.close()
        sys.exit()

其中‘顯示’項涉及到的函數(shù)代碼如下:

    # 顯示寵物
    def showwin(self):
        # setWindowOpacity()設置窗體的透明度,通過調(diào)整窗體透明度實現(xiàn)寵物的展示和隱藏
        self.setWindowOpacity(1)

③ 寵物靜態(tài)資源的加載,通過函數(shù)initPetImage實現(xiàn),其代碼配置如下:

????????靜態(tài)資源的加載主要涉及兩個部分,對話框內(nèi)容的加載和圖片內(nèi)容的加載。

    # 寵物靜態(tài)gif圖加載
    def initPetImage(self):
        # 對話框定義
        self.talkLabel = QLabel(self)
        # 對話框樣式設計
        self.talkLabel.setStyleSheet("font:15pt '楷體';border-width: 1px;color:blue;") 
        # 定義顯示圖片部分
        self.image = QLabel(self)
        # QMovie是一個可以存放動態(tài)視頻的類,一般是配合QLabel使用的,可以用來存放GIF動態(tài)圖
        self.movie = QMovie("normal/normal1.gif")
        # 設置標簽大小
        self.movie.setScaledSize(QSize(200, 200))
        # 將Qmovie在定義的image中顯示
        self.image.setMovie(self.movie)
        self.movie.start()
        self.resize(1024, 1024)
        # 調(diào)用自定義的randomPosition,會使得寵物出現(xiàn)位置隨機
        self.randomPosition()
        # 展示
        self.show()
        # https://new.qq.com/rain/a/20211014a002rs00
        # 將寵物正常待機狀態(tài)的動圖放入pet1中
        self.pet1 = []
        for i in os.listdir("normal"):
            self.pet1.append("normal/" + i)
        # 將寵物正常待機狀態(tài)的對話放入pet2中
        self.dialog = []
        # 讀取目錄下dialog文件
        with open("dialog.txt", "r") as f:
            text = f.read()
            # 以\n 即換行符為分隔符,分割放進dialog中
            self.dialog = text.split("\n")

????????其中我們希望寵物出現(xiàn)的位置是隨機的而不是固定的,那么便通過?randomPosition()實現(xiàn)寵物出現(xiàn)位置的隨機。

    # 寵物隨機位置
    def randomPosition(self):
        # screenGeometry()函數(shù)提供有關可用屏幕幾何的信息
        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ù)petNormalAction實現(xiàn),其代碼配置如下

? ? ? ? 這里通過QTimer實現(xiàn)定時操作,到達設置的時間即調(diào)用相關的函數(shù)。其中condition為標識寵物狀態(tài)的flag,0為平常狀態(tài),1為點擊狀態(tài),這個狀態(tài)可按照自己的喜好拓展。talk_condition同理,為標識寵物對話狀態(tài)的flag。

# 寵物正常待機動作
    def petNormalAction(self):
        # 每隔一段時間做個動作
        # 定時器設置
        self.timer = QTimer()
        # 時間到了自動執(zhí)行
        self.timer.timeout.connect(self.randomAct)
        # 動作時間切換設置
        self.timer.start(3000)
        # 寵物狀態(tài)設置為正常
        self.condition = 0
        # 每隔一段時間切換對話
        self.talkTimer = QTimer()
        self.talkTimer.timeout.connect(self.talk)
        self.talkTimer.start(3000)
        # 對話狀態(tài)設置為常態(tài)
        self.talk_condition = 0
        # 寵物對話框
        self.talk()

?????????其中,通過randomAct實現(xiàn)寵物動作的隨機切換,通過talk實現(xiàn)對話框內(nèi)容的切換,其代碼如下:

????????self.pet1和self.dialog在初始化的時候即定義了。這里可以按照自己的喜好進行拓展,用多個if-else if實現(xiàn)多種狀態(tài)的切換和定義,增加一些喂食,玩耍動作等。

 # 隨機動作切換
    def randomAct(self):
        # condition記錄寵物狀態(tài),寵物狀態(tài)為0時,代表正常待機
        if not self.condition:
            # 隨機選擇裝載在pet1里面的gif圖進行展示,實現(xiàn)隨機切換
            self.movie = QMovie(random.choice(self.pet1))
            # 寵物大小
            self.movie.setScaledSize(QSize(200, 200))
            # 將動畫添加到label中
            self.image.setMovie(self.movie)
            # 開始播放動畫
            self.movie.start()
        # condition不為0,轉為切換特有的動作,實現(xiàn)寵物的點擊反饋
        # 這里可以通過else-if語句往下拓展做更多的交互功能
        else:
            # 讀取特殊狀態(tài)圖片路徑
            self.movie = QMovie("./click/click.gif")
            # 寵物大小
            self.movie.setScaledSize(QSize(200, 200))
            # 將動畫添加到label中
            self.image.setMovie(self.movie)
            # 開始播放動畫
            self.movie.start()
            # 寵物狀態(tài)設置為正常待機
            self.condition = 0
            self.talk_condition = 0

    # 寵物對話框行為處理
    def talk(self):
        if not self.talk_condition:
            # talk_condition為0則選取加載在dialog中的語句
            self.talkLabel.setText(random.choice(self.dialog))
            # 設置樣式
            self.talkLabel.setStyleSheet(
                "font: bold;"
                "font:25pt '楷體';"
                "color:white;"
                "background-color: white"
                "url(:/)"
            )
            # 根據(jù)內(nèi)容自適應大小
            self.talkLabel.adjustSize()
        else:
            # talk_condition為1顯示為別點我,這里同樣可以通過if-else-if來拓展對應的行為
            self.talkLabel.setText("別點我")
            self.talkLabel.setStyleSheet(
                "font: bold;"
                "font:25pt '楷體';"
                "color:white;"
                "background-color: white"
                "url(:/)"
            )
            self.talkLabel.adjustSize()
            # 設置為正常狀態(tài)
            self.talk_condition = 0

⑤ 實現(xiàn)能夠拖動寵物,通過多個自帶函數(shù)實現(xiàn),其代碼配置如下:

? ? ? ? 實現(xiàn)寵物的拖動主要通過三個函數(shù)實現(xiàn),mouserPressEvent負責在鼠標點擊判斷其是否在寵物窗口上,如果在則將寵物和鼠標的位置綁定,并執(zhí)行點擊改變寵物GIF圖和對話框的操作。

? ? ? ? mouseMoveEvent實現(xiàn)按下后寵物跟著鼠標移動

????????mouseReleaseEvent將之前的鎖定取消

 # 鼠標左鍵按下時, 寵物將和鼠標位置綁定
    def mousePressEvent(self, event):
        # 更改寵物狀態(tài)為點擊
        self.condition = 1
        # 更改寵物對話狀態(tài)
        self.talk_condition = 1
        # 即可調(diào)用對話狀態(tài)改變
        self.talk()
        # 即刻加載寵物點擊動畫
        self.randomAct()
        if event.button() == Qt.LeftButton:
            self.is_follow_mouse = True
        # globalPos() 事件觸發(fā)點相對于桌面的位置
        # pos() 程序相對于桌面左上角的位置,實際是窗口的左上角坐標
        self.mouse_drag_pos = event.globalPos() - self.pos()
        event.accept()
        # 拖動時鼠標圖形的設置
        self.setCursor(QCursor(Qt.OpenHandCursor))

    # 鼠標移動時調(diào)用,實現(xiàn)寵物隨鼠標移動
    def mouseMoveEvent(self, event):
        # 如果鼠標左鍵按下,且處于綁定狀態(tài)
        if Qt.LeftButton and self.is_follow_mouse:
            # 寵物隨鼠標進行移動
            self.move(event.globalPos() - self.mouse_drag_pos)
        event.accept()

    # 鼠標釋放調(diào)用,取消綁定
    def mouseReleaseEvent(self, event):
        self.is_follow_mouse = False
        # 鼠標圖形設置為箭頭
        self.setCursor(QCursor(Qt.ArrowCursor))

⑥ 實現(xiàn)寵物右鍵點擊具有交互功能,通過函數(shù)contextMenuEvent實現(xiàn),其代碼配置如下:

? ? ? ? 退出操作通過?qApp.quit()實現(xiàn),直接退出相應的QT程序。

? ? ? ? 隱藏操作則通過self.setWindowOpacity(0)實現(xiàn),這個可控制窗口的透明度。

 # 寵物右鍵點擊交互
    def contextMenuEvent(self, event):
        # 定義菜單
        menu = QMenu(self)
        # 定義菜單項
        quitAction = menu.addAction("退出")
        hide = menu.addAction("隱藏")
        # 使用exec_()方法顯示菜單。從鼠標右鍵事件對象中獲得當前坐標。mapToGlobal()方法把當前組件的相對坐標轉換為窗口(window)的絕對坐標。
        action = menu.exec_(self.mapToGlobal(event.pos()))
        # 點擊事件為退出
        if action == quitAction:
            qApp.quit()
        # 點擊事件為隱藏
        if action == hide:
            # 通過設置透明度方式隱藏寵物
            self.setWindowOpacity(0)

好用的桌面寵物gif,python,桌面寵物

?

⑦ 鼠標移到寵物上的時候顯示為閉合的手

    # 鼠標移進時調(diào)用
    def enterEvent(self, event):
        # 設置鼠標形狀 Qt.ClosedHandCursor   非指向手
        self.setCursor(Qt.ClosedHandCursor)

2.3 完整源碼

import os
import sys
import random
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *


class DesktopPet(QWidget):
    def __init__(self, parent=None, **kwargs):
        super(DesktopPet, self).__init__(parent)
        # 窗體初始化
        self.init()
        # 托盤化初始
        self.initPall()
        # 寵物靜態(tài)gif圖加載
        self.initPetImage()
        # 寵物正常待機,實現(xiàn)隨機切換動作
        self.petNormalAction()


    # 窗體初始化
    def init(self):
        # 初始化
        # 設置窗口屬性:窗口無標題欄且固定在最前面
        # FrameWindowHint:無邊框窗口
        # WindowStaysOnTopHint: 窗口總顯示在最上面
        # SubWindow: 新窗口部件是一個子窗口,而無論窗口部件是否有父窗口部件
        # https://blog.csdn.net/kaida1234/article/details/79863146
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)
        # setAutoFillBackground(True)表示的是自動填充背景,False為透明背景
        self.setAutoFillBackground(False)
        # 窗口透明,窗體空間不透明
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        # 重繪組件、刷新
        self.repaint()

    # 托盤化設置初始化
    def initPall(self):
        # 導入準備在托盤化顯示上使用的圖標
        icons = os.path.join('tigerIcon.jpg')
        # 設置右鍵顯示最小化的菜單項
        # 菜單項退出,點擊后調(diào)用quit函數(shù)
        quit_action = QAction('退出', self, triggered=self.quit)
        # 設置這個點擊選項的圖片
        quit_action.setIcon(QIcon(icons))
        # 菜單項顯示,點擊后調(diào)用showing函數(shù)
        showing = QAction(u'顯示', self, triggered=self.showwin)
        # 新建一個菜單項控件
        self.tray_icon_menu = QMenu(self)
        # 在菜單欄添加一個無子菜單的菜單項‘退出’
        self.tray_icon_menu.addAction(quit_action)
        # 在菜單欄添加一個無子菜單的菜單項‘顯示’
        self.tray_icon_menu.addAction(showing)
        # QSystemTrayIcon類為應用程序在系統(tǒng)托盤中提供一個圖標
        self.tray_icon = QSystemTrayIcon(self)
        # 設置托盤化圖標
        self.tray_icon.setIcon(QIcon(icons))
        # 設置托盤化菜單項
        self.tray_icon.setContextMenu(self.tray_icon_menu)
        # 展示
        self.tray_icon.show()

    # 寵物靜態(tài)gif圖加載
    def initPetImage(self):
        # 對話框定義
        self.talkLabel = QLabel(self)
        # 對話框樣式設計
        self.talkLabel.setStyleSheet("font:15pt '楷體';border-width: 1px;color:blue;")
        # 定義顯示圖片部分
        self.image = QLabel(self)
        # QMovie是一個可以存放動態(tài)視頻的類,一般是配合QLabel使用的,可以用來存放GIF動態(tài)圖
        self.movie = QMovie("normal/normal1.gif")
        # 設置標簽大小
        self.movie.setScaledSize(QSize(200, 200))
        # 將Qmovie在定義的image中顯示
        self.image.setMovie(self.movie)
        self.movie.start()
        self.resize(1024, 1024)
        # 調(diào)用自定義的randomPosition,會使得寵物出現(xiàn)位置隨機
        self.randomPosition()
        # 展示
        self.show()
        # https://new.qq.com/rain/a/20211014a002rs00
        # 將寵物正常待機狀態(tài)的動圖放入pet1中
        self.pet1 = []
        for i in os.listdir("normal"):
            self.pet1.append("normal/" + i)
        # 將寵物正常待機狀態(tài)的對話放入pet2中
        self.dialog = []
        # 讀取目錄下dialog文件
        with open("dialog.txt", "r") as f:
            text = f.read()
            # 以\n 即換行符為分隔符,分割放進dialog中
            self.dialog = text.split("\n")

    # 寵物正常待機動作
    def petNormalAction(self):
        # 每隔一段時間做個動作
        # 定時器設置
        self.timer = QTimer()
        # 時間到了自動執(zhí)行
        self.timer.timeout.connect(self.randomAct)
        # 動作時間切換設置
        self.timer.start(3000)
        # 寵物狀態(tài)設置為正常
        self.condition = 0
        # 每隔一段時間切換對話
        self.talkTimer = QTimer()
        self.talkTimer.timeout.connect(self.talk)
        self.talkTimer.start(3000)
        # 對話狀態(tài)設置為常態(tài)
        self.talk_condition = 0
        # 寵物對話框
        self.talk()

    # 隨機動作切換
    def randomAct(self):
        # condition記錄寵物狀態(tài),寵物狀態(tài)為0時,代表正常待機
        if not self.condition:
            # 隨機選擇裝載在pet1里面的gif圖進行展示,實現(xiàn)隨機切換
            self.movie = QMovie(random.choice(self.pet1))
            # 寵物大小
            self.movie.setScaledSize(QSize(200, 200))
            # 將動畫添加到label中
            self.image.setMovie(self.movie)
            # 開始播放動畫
            self.movie.start()
        # condition不為0,轉為切換特有的動作,實現(xiàn)寵物的點擊反饋
        # 這里可以通過else-if語句往下拓展做更多的交互功能
        else:
            # 讀取特殊狀態(tài)圖片路徑
            self.movie = QMovie("./click/click.gif")
            # 寵物大小
            self.movie.setScaledSize(QSize(200, 200))
            # 將動畫添加到label中
            self.image.setMovie(self.movie)
            # 開始播放動畫
            self.movie.start()
            # 寵物狀態(tài)設置為正常待機
            self.condition = 0
            self.talk_condition = 0

    # 寵物對話框行為處理
    def talk(self):
        if not self.talk_condition:
            # talk_condition為0則選取加載在dialog中的語句
            self.talkLabel.setText(random.choice(self.dialog))
            # 設置樣式
            self.talkLabel.setStyleSheet(
                "font: bold;"
                "font:25pt '楷體';"
                "color:white;"
                "background-color: white"
                "url(:/)"
            )
            # 根據(jù)內(nèi)容自適應大小
            self.talkLabel.adjustSize()
        else:
            # talk_condition為1顯示為別點我,這里同樣可以通過if-else-if來拓展對應的行為
            self.talkLabel.setText("別點我")
            self.talkLabel.setStyleSheet(
                "font: bold;"
                "font:25pt '楷體';"
                "color:white;"
                "background-color: white"
                "url(:/)"
            )
            self.talkLabel.adjustSize()
            # 設置為正常狀態(tài)
            self.talk_condition = 0

    # 退出操作,關閉程序
    def quit(self):
        self.close()
        sys.exit()

    # 顯示寵物
    def showwin(self):
        # setWindowOpacity()設置窗體的透明度,通過調(diào)整窗體透明度實現(xiàn)寵物的展示和隱藏
        self.setWindowOpacity(1)

    # 寵物隨機位置
    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)

    # 鼠標左鍵按下時, 寵物將和鼠標位置綁定
    def mousePressEvent(self, event):
        # 更改寵物狀態(tài)為點擊
        self.condition = 1
        # 更改寵物對話狀態(tài)
        self.talk_condition = 1
        # 即可調(diào)用對話狀態(tài)改變
        self.talk()
        # 即刻加載寵物點擊動畫
        self.randomAct()
        if event.button() == Qt.LeftButton:
            self.is_follow_mouse = True
        # globalPos() 事件觸發(fā)點相對于桌面的位置
        # pos() 程序相對于桌面左上角的位置,實際是窗口的左上角坐標
        self.mouse_drag_pos = event.globalPos() - self.pos()
        event.accept()
        # 拖動時鼠標圖形的設置
        self.setCursor(QCursor(Qt.OpenHandCursor))

    # 鼠標移動時調(diào)用,實現(xiàn)寵物隨鼠標移動
    def mouseMoveEvent(self, event):
        # 如果鼠標左鍵按下,且處于綁定狀態(tài)
        if Qt.LeftButton and self.is_follow_mouse:
            # 寵物隨鼠標進行移動
            self.move(event.globalPos() - self.mouse_drag_pos)
        event.accept()

    # 鼠標釋放調(diào)用,取消綁定
    def mouseReleaseEvent(self, event):
        self.is_follow_mouse = False
        # 鼠標圖形設置為箭頭
        self.setCursor(QCursor(Qt.ArrowCursor))


    # 鼠標移進時調(diào)用
    def enterEvent(self, event):
        # 設置鼠標形狀 Qt.ClosedHandCursor   非指向手
        self.setCursor(Qt.ClosedHandCursor)

    # 寵物右鍵點擊交互
    def contextMenuEvent(self, event):
        # 定義菜單
        menu = QMenu(self)
        # 定義菜單項
        quitAction = menu.addAction("退出")
        hide = menu.addAction("隱藏")
        # 使用exec_()方法顯示菜單。從鼠標右鍵事件對象中獲得當前坐標。mapToGlobal()方法把當前組件的相對坐標轉換為窗口(window)的絕對坐標。
        action = menu.exec_(self.mapToGlobal(event.pos()))
        # 點擊事件為退出
        if action == quitAction:
            qApp.quit()
        # 點擊事件為隱藏
        if action == hide:
            # 通過設置透明度方式隱藏寵物
            self.setWindowOpacity(0)


if __name__ == '__main__':
    # 創(chuàng)建了一個QApplication對象,對象名為app,帶兩個參數(shù)argc,argv
    # 所有的PyQt5應用必須創(chuàng)建一個應用(Application)對象。sys.argv參數(shù)是一個來自命令行的參數(shù)列表。
    app = QApplication(sys.argv)
    # 窗口組件初始化
    pet = DesktopPet()
    # 1. 進入時間循環(huán);
    # 2. wait,直到響應app可能的輸入;
    # 3. QT接收和處理用戶及系統(tǒng)交代的事件(消息),并傳遞到各個窗口;
    # 4. 程序遇到exit()退出時,機會返回exec()的值。
    sys.exit(app.exec_())

三、程序打包

3.1 安裝pyinstaller

pip install pyinstaller 

如果提示黃色提示pip版本問題,照著上面的提示修改即可

?3.2 項目目錄下完成打包

????????進入打開cmd命令行,進入項目目錄,輸入命令

pyinstaller -F -w main.py

好用的桌面寵物gif,python,桌面寵物

?????????打包完成后,在生成的dist里面可以看到main.exe文件

好用的桌面寵物gif,python,桌面寵物

?

?????????

? ? ? ? 這里因為我自己的原因,需要將main.exe放到主目錄下才可正常運行

好用的桌面寵物gif,python,桌面寵物

?

四、總結與參考資料

4.1 項目百度網(wǎng)盤:

鏈接:https://pan.baidu.com/s/1YYXzGpmCJkz43tYuki1wFQ?
提取碼:3gkw

好用的桌面寵物gif,python,桌面寵物

DeskTopPetEXE為帶打包好的文件。

DeskTopPet是打包前的文件。

4.2 總結

寫之前挺開心的,寫的時候也挺開心的,寫完之后就有點索然無味了。用python做一個簡單的桌面寵物,我看到的方法除了我參考的這種加載GIF圖外:

Python 玩出花兒,把羅小黑養(yǎng)在自己桌面_AI科技大本營的博客-CSDN博客

還有一種通過加載圖片幀的方式實現(xiàn)

Python實現(xiàn)桌面寵物_hxxjxw的博客-CSDN博客_python桌面寵物

這種通過圖片幀的加載實現(xiàn),需要編寫一個自定義配置類cfg.py,很多人也不把這個東西代碼給出來:

'''配置文件'''

ROOT_DIR = 'resources'
ACTION_DISTRIBUTION = [['1', '2', '3'],
                  ['4', '5', '6', '7', '8', '9', '10', '11'],
                  ['12', '13', '14'],
                  ['15', '16', '17', '18']]


PET_ACTIONS_MAP = {'pet_1': ACTION_DISTRIBUTION}
for i in range(1, 4):
   PET_ACTIONS_MAP.update({'pet_%s' % i: ACTION_DISTRIBUTION})

這種方式寵物動作的實現(xiàn),是根據(jù)上面這個配置文件進行配置的,比如[1,2,3]就代表這個pet_1文件夾下對應1,2,3號圖片組成一個動作。我看到有人直接把這個當作一個動作賦值給寵物,然后圖片就會莫名鬼畜。

純粹是因為無聊寫著玩的,下次再試試能不能弄個3D的??文章來源地址http://www.zghlxwxcb.cn/news/detail-798138.html

到了這里,關于桌面寵物 ① 通過python制作屬于自己的桌面寵物的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 通過訓練NLP制作一個自己的簡易輸入法

    通過訓練NLP制作一個自己的簡易輸入法

    最近開始研究NLP,然后根據(jù)手寫CV UP主的視頻,寫了一個N Gram的NLP模型,算是該領域里的hello world吧。然后我又添加了幾行代碼實現(xiàn)了一個 非常簡易的輸入法 。 項目說明: 數(shù)據(jù)集可以自創(chuàng),導入txt文件即可; 單詞聯(lián)想功能:輸入前兩個單詞,預測(聯(lián)想)第三個單詞【也就是

    2024年02月08日
    瀏覽(19)
  • (詳細教程)opencv+python+pycharm 訓練屬于自己的分類器(以口罩識別為例)

    (詳細教程)opencv+python+pycharm 訓練屬于自己的分類器(以口罩識別為例)

    文章目錄 目錄 前言 一、分類器制作 1.樣本準備 2.樣本制作 (1)圖片重命名 (2)修改圖片像素 ?3.生成資源記錄文件 ?4.生成vec文件 ??5.訓練模型 二、檢驗分類器? 總結 本文詳細介紹怎么制作屬于自己的分類器,本篇以口罩識別為例來講解. 在pycharm建立的項目根目錄中建立mask文

    2024年02月03日
    瀏覽(22)
  • 用Python制作你的專屬音樂播放器(此刻浪漫只屬于你哦*′▽`*)

    用Python制作你的專屬音樂播放器(此刻浪漫只屬于你哦*′▽`*)

    昨天是博主的一位朋友生日,除了送上大大的紅包,知道他喜歡聽音樂,特意用代碼給他寫了一個 專屬音樂播放器 ,今天把這個代碼也開源送給所有粉絲哦。 我們常用的音樂播放器,比如酷狗,QQ音樂等里面的頁面款式都是官方設定好的,使用者無法根據(jù)自己的需求更改,

    2024年01月15日
    瀏覽(24)
  • wechaty擼一個屬于自己的微信機器人(Python版接入文心一言)

    wechaty擼一個屬于自己的微信機器人(Python版接入文心一言)

    說明: 機器人的框架找了很久,由于很多框架都不能使用了或者封號率極高,最后選擇了wewechaty,wechaty是可以使用ipad協(xié)議,主要是以node寫的,因為打算機器人接入爬蟲項目,所以特意用了python版本,對于python版網(wǎng)上教程太少且模糊且時間過于久遠,所做以此文為采坑記錄。 前期準備

    2024年02月04日
    瀏覽(25)
  • Python使用AI photo2cartoon制作屬于你的漫畫頭像

    Python使用AI photo2cartoon制作屬于你的漫畫頭像

    官方效果圖如下: 效果圖1如下: 效果圖2如下: 效果圖3如下: 人像卡通風格渲染的目標是,在保持原圖像 ID 信息和紋理細節(jié)的同時,將真實照片轉換為卡通風格的非真實感圖像。 但是圖像卡通化任務面臨著一些難題: 卡通圖像往往有清晰的邊緣,平滑的色塊和經(jīng)過簡化的

    2024年02月02日
    瀏覽(32)
  • Python使用AI animegan2-pytorch制作屬于你的漫畫頭像/風景圖片

    Python使用AI animegan2-pytorch制作屬于你的漫畫頭像/風景圖片

    官方效果圖如下: 效果圖v2 512模型如下: 效果圖v1 512模型如下: 效果圖v1 效果不太好如下: 效果圖rece如下 人物會有一種病態(tài)的美,過于白了,風景上效果更好一些; 人物與photo2cartoon的效果圖有點像; 效果圖paprika 模型如下 人物紋理痕跡太過明顯,更適合風景 下一張明蘭

    2024年01月24日
    瀏覽(20)
  • 文字gif閃圖怎么做?高效的gif閃圖制作方法

    文字gif閃圖怎么做?高效的gif閃圖制作方法

    相信不少新媒體行業(yè)的小伙伴,一定都見過那種閃動文字效果的gif動圖吧。效果非常的炫酷還很吸引人們的眼球,但是作為設計小白這種閃爍gif圖要怎么制作呢?有沒有那種小白也能輕松上手的工具呢? 一、什么樣的工具能夠在線生成gif動態(tài)圖? 使用GIF中文網(wǎng)的gif制作(h

    2024年02月06日
    瀏覽(28)
  • python如何制作自己的模塊

    1.創(chuàng)建一個新的.py文件,并定義你自己的函數(shù)或類。 2.編寫文檔字符串docstring,說明該函數(shù)或類的作用、參數(shù)和返回值說明等。 3.給你的函數(shù)或類添加恰當?shù)淖⑨尅?4.將該.py文件放在工程目錄的一個新文件夾中,這個文件夾就是你的模塊。 5.在你需要使用該模塊的Python腳本中

    2024年02月15日
    瀏覽(25)
  • ps制作gif動圖

    ps制作gif動圖

    最后存儲就可以了

    2024年02月09日
    瀏覽(27)
  • Matlab動圖保存——GIF制作與視頻制作

    在Matlab繪制動圖時,若想保存成GIF或視頻,可參考以下代碼。 (1)GIF格式 (2)視頻格式

    2024年02月07日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包