桌宠(python)<--CSDN @PythonWIN-->

2 篇文章 0 订阅
2 篇文章 0 订阅

- 这是一款基于 pyQT5 的小型软件:

        -我们使用了著名的 Python 语言

-我目前正在开发桌面宠物 SVIP 1.1 版,并使用 Python 作为编辑器。

现在我来详细介绍一下它的功能:

        -第一,动画拖动和 GIF 动画播放


        -第二,可通过修改配置中的菜单自定义右键菜单,还可自定义脚本以简化电脑使用

        -第三,自定义捕虫风格,只需更改宠物文件夹和下方的 GIF 图标,即可实现捕虫风格的更换

--------------------------------------------------------------------------------------
 关于右键菜单设置:

        -右键菜单可通过编辑配置文件夹下的 menu_config.json 文件进行自定义,以动态修改右键菜单的内容。

-右键菜单可通过编辑配置文件夹下的 menu_config.json 文件进行自定义,以动态修改右键菜单的内容。

{
    "主菜单": [
        {
            "name": "GPT-academic",
            "type": "subprocess.Popen",# 可选type类型:subprocess.run、subprocess.Popen、webbrowser(打开浏览器)
            "params": [
                "powershell",
                "-ExecutionPolicy",
                "Bypass",
                "-File",
                ".\\bat\\academic.ps1"
            ]
        },
		......
    ],
    "子菜单的名称": [
        {
            "name": "子菜单的名称",
            "type": "使用何种方式打开",
            "params": "参数"
        },
        {#示例 在浏览器中打开网站http://localhost:5244/
            "name": "我要看Alist",
            "type": "webbrowser",
            "params": "http://localhost:5244/"
        }
    ]
    ......
}

-这是 bat 脚本的示例,通常是 subcess.run。

@echo off
start "" "D:\Qingfeng\HeyboxAccelerator\heyboxacc.exe"
start "" "D:\Program Files (x86)\Tencent\TIM\Bin\QQScLauncher.exe"
start "" "D:\Program Files\Steam++\Steam++.exe"

这是powershell脚本示例 一般使用subprocess.Popen

Start-Process "D:\sunshine\Sunshine\SunShine.exe" -WorkingDirectory "D:\sunshine\Sunshine"
Start-Process "C:\Program Files\Oray\SunLogin\SunloginClient\SunloginClient.exe"
Start-Process "C:\Program Files\Tailscale\tailscale-ipn.exe"

打开网页不需要配置脚本文件,直接在上面的配置文件中修改即可

--------------------------------------------------------------------------------------

自定义样式

这是桌面宠物样式文件夹的格式,

在pet文件下的init文件存放的是桌宠初始化的gif文件,这里面的文件名称必须符合下面的规则

  • move.gif是桌宠被拖拽的样式
  • start.gif是桌宠刚启动的样式
  • stay.gif是桌宠被拖动过后的样式

然后pet文件夹下面的其他gif文件则是桌宠随机播放的文件,这里面的文件不用修改名字。

替换时只需要按照上面的规则来替换即可。

--------------------------------------------------------------------------------------

计划加入的功能

        添加移动功能

        接入大语言模型对话

        语音对话,语音唤醒

        接入agent框架实现自主对话和移动?

        与鼠标的互动?

--------------------------------------------------------------------------------------

废话不多说,放程序:

class DemoWin(QMainWindow):
    def __init__(self):
        super(DemoWin, self).__init__()
        # 初始化宠物
        self.select_pet = 'pet'
        self.select_music=''
        self.pet = []
        for i in os.listdir(os.path.abspath(self.select_pet)):
            self.pet.append(os.path.join(os.path.abspath(self.select_pet), i))
        self.pet.remove(os.path.join(os.path.abspath(self.select_pet), 'init'))
        # 初始化窗口
        self.initUI()
        # 初始化,不规则窗口
        # 将窗口设置为无边框、总在最前,并且作为子窗口使用
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)
        # 禁用了窗口的自动背景填充
        self.setAutoFillBackground(False)
        # 将窗口背景设置为透明
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        # 重新绘制窗口,以便上述设置立即生效
        self.repaint()
        # 是否跟随鼠标
        self.is_follow_mouse = False
        # 桌面宠物的坐标
        self.w = 1550
        self.h = 949
        # 设置桌面宠物的初始位置
        self.move(self.w, self.h)
        # 宠物是否飞行
        self.is_flying = None

        # 设置托盘选项
        iconpath = "./mypetico.ico"
        # 右键菜单
        quit_action = QAction(u'退出', 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()

        # 窗口透明程度
        self.setWindowOpacity(1)
        # 改变宠物样式
        self.change_pet = ''
        self.change_music = ''
        # 每隔一段时间做个动作
        self.timer = QTimer()
        self.timer.timeout.connect(self.randomAct)
        self.timer.start(1000)
        self.condition = 0
        self.talk_condition = 0


        # 默认动作为随机1, 飞翔动作为2 左右运动3
        self.action = 1
    '''随即桌宠皮肤'''
    def sent_pet(self, pet):
        self.pet = []
        for i in os.listdir(os.path.abspath(self.change_pet)):
            self.pet.append(os.path.join(os.path.abspath(self.change_pet), i))
        self.pet.remove(os.path.join(os.path.abspath(self.change_pet), 'init'))
        pass
    def music(self,music):
        print('music_do')
        QSound.play('music/轻音乐/'+music)

#老师就是这个上面这个music函数调用它的时候它不播放音乐。
    def initUI(self):
        # 将窗口设置为动图大小
        self.resize(400, 400)
        self.label1 = QLabel("", self)
        self.label1.setStyleSheet("font:15pt '楷体';border-width: 1px;color:blue;")  # 设置边框
        # 使用label来显示动画
        self.label = QLabel("", self)
        # label大小设置为动画大小
        self.label.setFixedSize(200, 200)
        self.Action(os.path.join(os.path.abspath(self.select_pet), "init/start.gif"))
        self.setWindowTitle("myPet")

    def playSound(self):
        QSound.play("chicken.wav")
        print('playsound_play')



    '''鼠标左键按下时, 宠物将和鼠标位置绑定'''

    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.ClosedHandCursor))
            self.Action(os.path.join(os.path.abspath(self.select_pet), "init/move.gif"))

    '''鼠标移动, 则宠物也移动'''

    def mouseMoveEvent(self, event):
        if Qt.LeftButton and self.is_follow_mouse:
            self.move(event.globalPos() - self.mouse_drag_pos)
            event.accept()
            xy = self.pos()
            self.w, self.h = xy.x(), xy.y()
            pass

    '''鼠标释放时, 取消绑定'''

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.RightButton:
            return
        self.Action(os.path.join(os.path.abspath(self.select_pet), "init/touch.gif"))
        self.is_follow_mouse = False
        self.setCursor(Qt.OpenHandCursor)
        self.playSound()

    '''接触宠物的时候调用'''

    def enterEvent(self, event):  # 鼠标移进时调用
        # print('鼠标移入')
        self.Action(os.path.join(os.path.abspath(self.select_pet), "init/touch.gif"))
        self.setCursor(Qt.OpenHandCursor)

    def mouseDoubleClickEvent(self, event):
        print("鸡叫")
        self.playSound()

    def execute_action(self, action_config):
        #print(action_config)

        if action_config['type'] == 'subprocess.run':
            subprocess.run(action_config['params'], shell=True)
        elif action_config['type'] == 'webbrowser':
            webbrowser.open(action_config['params'])
        elif action_config['type'] == 'subprocess.Popen':
            subprocess.Popen(action_config['params'], creationflags=subprocess.CREATE_NEW_CONSOLE)
        elif action_config['type'] == 'pet':
            self.change_pet = action_config['params'][0]
            self.sent_pet(self.change_pet)
            self.select_pet = self.change_pet
        elif action_config['type'] == 'music':
            print('music_down')
            self.change_music = action_config['params'][0]
            print(self.change_music)
            self.music(self.change_music)
            #self.playSound()


    def contextMenuEvent(self, event):
        menus = []
        actions = []
        action_configs = []
        # 读取配置文件
        try:
            with open("./config/menu_config.json", "r", encoding="utf-8") as config:
                menu_config = json.load(config)
        except Exception as e:
            print(e)
            return

        # 获取子菜单项
        for menu in menu_config:
            # print(menu)
            menus.append(QMenu(str(menu), self))
            # 获取action
            for action_config in menu_config[menu]:
                # print(action_config)
                action_configs.append(action_config)
                actions.append(menus[-1].addAction(action_config["name"]))

        for i, menu in enumerate(menus):
            if i == 0:
                continue
            menus[0].addMenu(menu)

        quitAction = menus[0].addAction("退出")
        action = menus[0].exec_(self.mapToGlobal(event.pos()))

        if action in actions:
            self.execute_action(action_configs[actions.index(action)])

        if action == quitAction:
            qApp.quit()

    '''退出程序'''

    def quit(self):
        self.close()
        sys.exit()

    def Action(self, action):
        # 设置动画路径
        self.movie = QMovie(action)
        # 宠物大小
        self.movie.setScaledSize(QSize(200, 200))
        # 将动画添加到label中
        self.label.setMovie(self.movie)
        # 开始播放动画
        self.movie.start()

    '''随机做一个动作'''

    def randomAct(self):
        # 检测是否飞行
        if self.h != 949:
            self.playSound()
            self.is_flying = True
            self.action = 2
        else:
            self.is_flying = False
            self.action = 1

        if self.action == 1:
            if not self.condition:
                print("状态变更")
                a = random.choice(self.pet)
                print(a)
                self.Action(a)
                self.condition = 1
            else:
                print("状态还原")
                self.Action(os.path.join(os.path.abspath(self.select_pet), "init/stay.gif"))
                self.condition = 0
            self.timer.start(random.randint(10, 30) * 100)
        elif self.action == 2:
            # 实现行进效果
            if True:
                # 飞行效果
                if self.is_flying:
                    if self.h > 950:
                        self.h = 0
                    elif self.h > 940:
                        self.h += 1
                    else:
                        self.h += 10

                self.move(self.w, self.h)
                self.timer.start(random.randint(10, 30) * 100)
        elif self.action == 3:
            # self.w
            self.move(self.w, self.h)
            self.timer.start(random.randint(10, 30) * 10)

这就是所有程序!!!

--------------------------------------------------------------------------------------

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值