当前位置: 首页 > news >正文

【使用Python编写游戏辅助工具】第五篇:打造交互式游戏工具界面:PySide6/PyQT高效构建GUI工具

image.png

前言

这里是【使用Python编写游戏辅助工具】的第五篇:打造交互式游戏工具界面:PySide6/PyQT高效构建GUI工具。本文主要介绍使用PySide6来实现构建GUI工具。

在前面,我们实现了两个实用的游戏辅助功能:

  1. 由键盘监听事件触发的鼠标连击功能;
  2. 对Windows窗口的多种操作(如隐藏、显示、设置前台等

在这一篇文章中,笔者将带领读者朋友们使用 PySide6/PyQT 将前面实现的功能封装成一个GUI工具,这样一个简单的游戏辅助工具初具雏形了。

即使你完全没有 PySide6/PyQT 这方面的开发经验也没关系,学习就完事了;

即便不想学习,笔者也会提供源码,拿来用就完事了。

本文章为本系列文章最后一篇,【使用Python编写游戏辅助工具】系列文章到此结束。


文章脉络概述

该工具大致的组织架构如下图所示:

  • 包含 鼠标连击Windows窗口操作等功能!
辅助工具
鼠标连击
Windows窗口操作

在本系列文章中,我们将逐步构建一个游戏辅助工具,它将提供以下主要功能(所有功能都是借助Python的相关库和模块来帮助我们实现的;):

  1. 鼠标连击器:实现自动触发连续鼠标点击动作,帮助我们实现连击操作;

  2. Windows窗口操作:利用Python的相关库和模块,我们将探索如何操作和控制Windows窗口,包括隐藏窗口、显示窗口、置顶窗口等操作;

系列文章脉络

系列文章内容大体如下,后续可能会更新新的文章。

  • 点击直达:【使用Python编写游戏辅助工具】第一篇:概述

  • 点击直达:【使用Python编写游戏辅助工具】第二篇:键盘监听的应用

  • 点击直达:【使用Python编写游戏辅助工具】第三篇:鼠标连击器的实现

  • 点击直达:【使用Python编写游戏辅助工具】第四篇:Windows窗口操作

  • 点击直达:【使用Python编写游戏辅助工具】第五篇:打造交互式游戏工具界面:PySide6/PyQT高效构建GUI工具

知识点📖📖

库和模块描述
PySide6/PyQT提供了Python与Qt框架的绑定,用于创建图形用户界面(GUI)

安装依赖

pip install pyside6

这个模块就可以很好的实现本文的主题。

实现

因文章篇幅有限,抓重点来讲。

本文的代码实在是太多了,也不知从哪说起。干脆把代码都贴上来,

操作示例

视频介绍:咸鱼之王后台挂机软件和 鼠标连点器 Python实现

  • 下面的动图主要展示了该工具可以最小化到系统托盘,并从系统托盘恢复的操作。

展示最小化到系统托盘.gif

项目组织

使用PySide6/PyQT 构建的GUI工具组织架构如下所示:

  • 采用了MVC模型,通过MVC模式的应用,可以实现数据、用户界面和业务逻辑的解耦,提高代码的可读性、可维护性和可测试性;
  • 模型、视图和控制器各自担负不同的责任,使代码更具结构化,并允许团队成员分工合作,独立开发和测试各个组件。
GameAssistant/
├── controllers/
│   ├── __init__.py
│   └── controller_main.py
├── make/
│   └── 辅助小工具.spec
├── models/
│   ├── invoke_func/
│   │   ├── __init__.py
│   │   ├── mouse_click.py
│   │   └── window_operate.py
│   ├── __init__.py
│   └── model_main.py
├── views/
│   ├── resources/
│   │   ├── main.ui
│   │   ├── trash.png
│   │   └── utils.qrc
│   ├── ui/
│   │   ├── __init__.py
│   │   ├── main_ui.py
│   │   └── utils_rc.py
│   ├── widgets/
│   │   ├── __init__.py
│   │   └── view_main.py
│   └── __init__.py
├── main.py
├── README.md
└── requirements.txt

绘制GUI界面

designer.exe 软件中,绘制出下图所示的工具界面(路径在views/resources/main.ui

  • 使用了QTabWidget 控件,绘制了两个页面。
    1. 鼠标连击 页面,有一个输入框;
    2. 后台挂机 页面,有一个输入框和两个按钮

这个比较简单,动手拖拽需要的控件,拼凑起来就可以了(有手就行。

如下动图所示:

工具展示.gif

model(模型)

这里使用了 QRunnable + QThreadPool 实现的线程池,并将所有任务都给到 线程池中运行。

  • 鼠标点击Windows操作 的代码放置在(models/invoke_func/
# -*- coding: utf-8 -*-
# Name:         model_main.py
# Author:       小菜
# Date:         2023/6/14 20:00
# Description:from collections import defaultdict
from PySide6.QtCore import (QObject, QRunnable, QThreadPool, Signal)from models.invoke_func.mouse_click import click_mouse
from models.invoke_func.window_operate import (show_window, hide_window)flag = Trueclass WorkerRunnable(QRunnable):def __init__(self, func, *args, **kwargs):super().__init__()self.func = funcself.args = argsself.status_signal = kwargs.get('status_signal')def run(self):if not self.args:self.func()while flag:self.func(*self.args)def win_run(self):res = self.func(*self.args)self.status_signal.emit({'status': res})class ModelMain(QObject):win_status_signal: Signal = Signal(dict)def __init__(self):super().__init__()self.thread_pool = QThreadPool()self.thread_status_map = defaultdict(bool)def stop_keyboard_listener(self):global flagif flag:flag = Falsethread_name: str = 'click'self.thread_status_map[thread_name] = Falsedef click_operate(self, frequency: int = 10):global flagthread_name: str = 'click'if self.thread_status_map[thread_name]:returnflag = Trueself.thread_status_map[thread_name] = Trueif frequency < 10:frequency = 10print(flag, thread_name, self.thread_status_map[thread_name], frequency)click_frequency_map = {10: [0.09],20: [0.035],30: [0.027],40: [0.014],50: [0.013],60: [0.005],70: [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0],80: [0.01, 0.01, 0.01, 0],90: [0.01, 0.01, 0],100: [0.01, 0.0001, 0.0001, 0, 0],150: [0.001, 0.001, 0, 0, 0]}task = WorkerRunnable(click_mouse,click_frequency_map.get(frequency, 150))self.thread_pool.start(task)def show_win_operate(self, title: str = None):task = WorkerRunnable(show_window,title,status_signal=self.win_status_signal)self.thread_pool.start(task.win_run)def hide_win_operate(self, title: str = None):task = WorkerRunnable(hide_window,title,status_signal=self.win_status_signal)self.thread_pool.start(task.win_run)

view(视图)

视图代码实现了

  • 添加工具到系统托盘,从系统托盘退出或恢复工具;
  • 按下键盘的 Esc就最小化到系统托盘;
# -*- coding: utf-8 -*-
# Name:         view_main.py
# Author:       小菜
# Date:         2023/6/14 20:00
# Description:
import osfrom PySide6.QtGui import (QAction, QIcon, QShortcut, QKeySequence)
from PySide6.QtWidgets import (QMainWindow, QSystemTrayIcon, QMenu)from views import Ui_MainWindowclass ViewMain(QMainWindow, Ui_MainWindow):def __init__(self, parent=None) -> None:super().__init__(parent=parent)self.setupUi(self)# 创建系统托盘图标相关的变量和对象self._restore_action = QAction()self._quit_action = QAction()self._tray_icon_menu = QMenu()# 创建系统托盘图标self.tray_icon = QSystemTrayIcon(self)self.tray_icon.setIcon(QIcon(u":/trash.png"))self.tray_icon.setToolTip("辅助小工具")# 创建系统托盘图标的菜单和动作self.create_actions()self.create_tray_icon()self.tray_icon.show()# 连接系统托盘图标的激活信号到槽函数self.tray_icon.activated.connect(self.tray_icon_activated)# 键盘监听self.listen_keyboard()def tray_icon_activated(self, reason):# 当系统托盘图标被激活时的操作if reason == QSystemTrayIcon.ActivationReason.Trigger:self.restore_from_tray()def restore_from_tray(self):# 还原窗口if self.isMinimized():self.showNormal()elif self.isMaximized():self.showMaximized()else:self.show()def create_actions(self):# 创建系统托盘图标菜单的动作self._restore_action = QAction("显示", self)self._restore_action.triggered.connect(self.restore_from_tray)  # "显示"菜单项触发还原窗口的操作self._quit_action = QAction("退出", self)self._quit_action.triggered.connect(lambda: os._exit(0))  # "退出"菜单项触发退出应用程序的操作def create_tray_icon(self):# 创建系统托盘图标的菜单self._tray_icon_menu = QMenu(self)self._tray_icon_menu.addAction(self._restore_action)self._tray_icon_menu.addSeparator()self._tray_icon_menu.addAction(self._quit_action)self.tray_icon.setContextMenu(self._tray_icon_menu)self.tray_icon.show()def show_notification(self, title: str = '连击信息⚠', text: str = None, icon=QSystemTrayIcon.MessageIcon.Information):# 显示系统通知self.tray_icon.showMessage(title,f"警告!!!{text}",icon,2000)def listen_keyboard(self):# 键盘监听shortcut = QShortcut(QKeySequence("Esc"), self)# 当按下 Esc 键时隐藏窗口shortcut.activated.connect(self.hide)

controller(控制器

这里做的操作是将 model与view连接起来,充当了一个中间人的活儿。

# -*- coding: utf-8 -*-
# Name:         controller_main.py
# Author:       小菜
# Date:         2023/6/14 20:00
# Description:import keyboard
from PySide6.QtCore import Slot
from PySide6.QtWidgets import QSystemTrayIconfrom views import ViewMain
from models import (ModelMain, WorkerRunnable)round_to_nearest_10 = lambda number: min(round(number / 10) * 10, 150)class ControllerMain:def __init__(self):self.view = ViewMain()self.model = ModelMain()# 显示窗口self.view.show()# 初始化 键盘监听self.init_operate()# 绑定按钮self.view.btn_show_win.clicked.connect(self.show_win_operate)self.view.btn_hide_win.clicked.connect(self.hide_win_operate)# 绑定信号到槽函数self.model.win_status_signal.connect(self.window_listen)def init_operate(self):task = WorkerRunnable(self.listen_keyboard)self.model.thread_pool.start(task)def listen_keyboard(self):keyboard.add_hotkey('Ctrl+Shift+A', self.click_operate)keyboard.add_hotkey('Ctrl+Shift+Q', self.model.stop_keyboard_listener)keyboard.wait()def click_operate(self):frequency = 10# 创建匿名函数try:frequency = round_to_nearest_10(int(self.view.line_edit_click.text()))print(frequency)except (ValueError, TypeError):...finally:self.model.click_operate(frequency=frequency)self.view.show_notification(text='开始点击')def show_win_operate(self):win_title = self.view.line_edit_title.text()if not win_title:returnself.model.show_win_operate(title=win_title)def hide_win_operate(self):win_title = self.view.line_edit_title.text()if not win_title:returnself.model.hide_win_operate(title=win_title)@Slot(dict)def window_listen(self, item):if not item.get('status'):self.view.show_notification(title='警告警告⚠',text='找不到窗口!!!',icon=QSystemTrayIcon.MessageIcon.Warning)

main函数

函数启动入口

# -*- coding: utf-8 -*-
# Name:         main.py
# Author:       小菜
# Date:         2023/6/14 20:00
# Description:import sys
from ctypes import windllfrom PySide6.QtWidgets import QApplicationfrom controllers import ControllerMainif __name__ == '__main__':# 同步图标windll.shell32.SetCurrentProcessExplicitAppUserModelID('nothing')app = QApplication()# 关闭窗口时候不退出程序app.setQuitOnLastWindowClosed(False)controller = ControllerMain()# 事件循环sys.exit(app.exec())

总结🎈🎈

本文介绍了 PySide6/PyQT 打包游戏辅助工具的操作。

将前面介绍的 鼠标连点Windows窗口操作等功能打包成一个GUI工具,从更加方便后续的使用。

总而言之,本文通过详细介绍使用 PySide6/PyQT 打包GUI的操作,帮助读者理解和应用Python在游戏辅助工具开发中的打包功能。

相关文章:

【使用Python编写游戏辅助工具】第五篇:打造交互式游戏工具界面:PySide6/PyQT高效构建GUI工具

前言 这里是【使用Python编写游戏辅助工具】的第五篇&#xff1a;打造交互式游戏工具界面&#xff1a;PySide6/PyQT高效构建GUI工具。本文主要介绍使用PySide6来实现构建GUI工具。 在前面&#xff0c;我们实现了两个实用的游戏辅助功能&#xff1a; 由键盘监听事件触发的鼠标连…...

06.Oracle数据备份与恢复

Oracle数据备份与恢复 一、通过RMAN方式备份二、使用emp/imp和expdb/impdb工具进行备份和恢复三、使用Data guard进行备份与恢复 一、通过RMAN方式备份 通过 RMAN&#xff08;Oracle 数据库备份和恢复管理器&#xff09;方式备份 Oracle 数据库&#xff0c;可以使用以下步骤&a…...

大航海时代Ⅳ 威力加强版套装 HD Version (WinMac)中文免安装版

《大航海时代》系列的人气SRPG《大航海时代IV》以HD的新面貌再次登场&#xff01;本作品以16世纪的欧洲“大航海时代”为舞台&#xff0c;玩家将以探险家、商人、军人等不同身份与全世界形形色色的人们一起上演出跌宕起伏的海洋冒险。游戏中玩家的目的是在不同的海域中掌握霸权…...

微信小程序 uCharts的使用方法

一、背景 微信小程序项目需要渲染一个柱状图&#xff0c;使用uCharts组件完成 uCharts官网指引&#x1f449;&#xff1a;uCharts官网 - 秋云uCharts跨平台图表库 二、实现效果 三、具体使用 进入官网查看指南&#xff0c;有两种方式进行使用&#xff1a;分别是原生方式与组…...

面试算法54:所有大于或等于节点的值之和

题目 给定一棵二叉搜索树&#xff0c;请将它的每个节点的值替换成树中大于或等于该节点值的所有节点值之和。假设二叉搜索树中节点的值唯一。例如&#xff0c;输入如图8.10&#xff08;a&#xff09;所示的二叉搜索树&#xff0c;由于有两个节点的值大于或等于6&#xff08;即…...

七月论文审稿GPT第二版:从Meta Nougat、GPT4审稿到LongLora版LLaMA、Mistral

前言 如此前这篇文章《学术论文GPT的源码解读与微调&#xff1a;从chatpaper、gpt_academic到七月论文审稿GPT》中的第三部分所述&#xff0c;对于论文的摘要/总结、对话、翻译、语法检查而言&#xff0c;市面上的学术论文GPT的效果虽暂未有多好&#xff0c;可至少还过得去&am…...

PyTorch入门学习(十二):神经网络-搭建小实战和Sequential的使用

目录 一、介绍 二、先决条件 三、代码解释 一、介绍 在深度学习领域&#xff0c;构建复杂的神经网络模型可能是一项艰巨的任务&#xff0c;尤其是当您有许多层和操作需要组织时。幸运的是&#xff0c;PyTorch提供了一个方便的工具&#xff0c;称为Sequential API&#xff0c…...

Linux shell编程学习笔记20:case ... esac、continue 和break语句

一、case ... esac语句说明 在实际编程中&#xff0c;我们有时会请到多条件多分支选择的情况&#xff0c;用if…else语句来嵌套处理不烦琐&#xff0c;于是JavaScript等语言提供了多选择语句switch ... case。与此类似&#xff0c;Linux Shell脚本编程中提供了case...in...esa…...

树莓派4无法进入桌面模式(启动后出现彩色画面,然后一直黑屏,但是可以正常启动和ssh)

本文记录了这段比较坎坷的探索之路&#xff0c;由于你的问题不一定是我最终解决方案的&#xff0c;可能是前面探索路上试过的&#xff0c;所以建议按顺序看排除前置问题。 双十一又买了个树莓派 4B&#xff0c;插上之前树莓派 4B 的 TF 卡直接就能使用&#xff08;毕竟是一样规…...

花草世界生存技能

多菌灵 杀菌常用 阿维菌素 杀虫常用 除蚜虫 吡虫啉 有毒性 内吸性&#xff08;植物吸收&#xff09; 苦参碱 无毒&#xff0c;中药提取 内吸性药 吡虫啉&#xff0c;噻虫嗪、啶虫脒、苦参碱 栀子花 春秋花后修剪 牡丹 秋冬种植&#xff1b; 洛阳产地&#xff1b; 肥料 …...

执行npm install时老是安装不成功node-sass的原因和解决方案

相信你安装前端项目所需要的依赖包&#xff08;npm install 或 yarn install&#xff09;时&#xff0c;有可能会出现如下报错&#xff1a; D:\code\**project > yarn install ... [4/4] Building fresh packages... [-/6] ⠁ waiting... [-/6] ⠂ waiting... [-/6] ⠂ wai…...

【MongoDB】集群搭建实战 | 副本集 Replica-Set | 分片集群 Shard-Cluster | 安全认证

文章目录 MongoDB 集群架构副本集主节点选举原则搭建副本集主节点从节点仲裁节点 连接节点添加副本从节点添加仲裁者节点删除节点 副本集读写操作副本集中的方法 分片集群分片集群架构目标第一个副本集第二个副本集配置集初始化副本集路由集添加分片开启分片集合分片删除分片 安…...

「Verilog学习笔记」四选一多路器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 通过波形示意图我们可以发现&#xff0c;当sel为0&#xff0c;1&#xff0c;2时&#xff0c;输出mux_out分别为d3&#xff0c;d2&#xff0c;d1&#xff0c;那么sel3…...

asp.net 创建docker容器

首先创建asp.net web api 创建完成后如下图 添加docker支持 添加docker支持 添加linux docker支持...

Linux项目自动化构建工具-make/Makefile使用

make/Makefile使用介绍 make是一个命令makefile是一个在当前目录下存在的一个具有特定格式的文本文件 ​ 下面我们设计一个场景&#xff0c;实现make命令对我们code.c文件进行编译和删除。 1 #include<stdio.h> 2 3 int main() 4 { 5 printf("hello,world!…...

【React】03.脚手架的进阶应用

文章目录 暴露webpack配置暴露前后的区别config文件夹&#xff1a;scripts文件夹&#xff1a;package.json 常见的配置修改1.把sass改为less2.配置别名3.修改域名和端口号4.修改浏览器兼容5.处理Proxy跨域 2023年最新珠峰React全家桶【react基础-进阶-项目-源码-淘系-面试题】 …...

WPF开源控件HandyControl——零基础教程

学习Handycontrol的过程中,为后边快速开发,写的零基础教程,尽量看完就可以实践! 参考教程 中文文档:欢迎使用HandyControl | HandyOrg Github代码:https://github.com/HandyOrg/HandyControl 使用教程:WPF-HandyControl安装和使用 - 掘金 安装配置教程 创建wpf项目 …...

chinese-stable-diffusion中文场景文生图prompt测评集合

腾讯混元大模型文生图操作指南.dochttps://mp.weixin.qq.com/s/u0AGtpwm_LmgnDY7OQhKGg腾讯混元大模型再进化&#xff0c;文生图能力重磅上线&#xff0c;这里是一手实测腾讯混元的文生图在人像真实感、场景真实感上有比较明显的优势&#xff0c;同时&#xff0c;在中国风景、动…...

K-均值聚类算法

K-均值聚类算法是一种常用的无监督学习算法&#xff0c;目的是将一组数据点分为 K 个聚类。它的主要思想是通过迭代的方式不断调整聚类中心的位置&#xff0c;使得数据点与最近的聚类中心之间的距离最小。 算法步骤如下&#xff1a; 初始化 K 个聚类中心&#xff0c;可以随机…...

Xbox漫游指南

以Xbox series s为例 开机启动 用手柄连接&#xff0c;注意两颗电池要方向相反插入&#xff0c;虽然里面2个插槽长一样&#xff1b; Xbox APP极其难用&#xff0c;放弃&#xff0c;直接用手柄连接 转区 只需要一个空U盘&#xff0c;大小不限制&#xff0c;格式化为NTPS格式…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...