From d17a54eb73edc700d2cfe865e03cea3ff1458d6e Mon Sep 17 00:00:00 2001 From: "feifei.xu" <307327147@qq.com> Date: Fri, 12 Jun 2026 16:01:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 32 +- LICENSE | 18 - README.md | 1 - build.py | 72 + core/__init__.py | 18 + core/logging/log.py | 209 + core/logging/log.ui | 24 + core/logging/log_ui.py | 42 + core/tools/tool_card.py | 15 + core/tools/tool_card.ui | 90 + core/tools/tool_card_ui.py | 91 + core/tools/tools.py | 86 + core/tools/tools.ui | 30 + core/tools/tools_ui.py | 47 + main.ico | Bin 32543 -> 0 bytes main.py | 121 +- main.ui | 58 +- main_ui.py | 42 +- nuitka-crash-report.xml | 7481 ++++++++++++++++++++++++++++++++++++ requirements.txt | 4 + resources/main.ico | Bin 0 -> 41190 bytes resources/my.qss | 19 + resources/tools.ico | Bin 0 -> 5014 bytes 23 files changed, 8448 insertions(+), 52 deletions(-) delete mode 100644 LICENSE create mode 100644 build.py create mode 100644 core/__init__.py create mode 100644 core/logging/log.py create mode 100644 core/logging/log.ui create mode 100644 core/logging/log_ui.py create mode 100644 core/tools/tool_card.py create mode 100644 core/tools/tool_card.ui create mode 100644 core/tools/tool_card_ui.py create mode 100644 core/tools/tools.py create mode 100644 core/tools/tools.ui create mode 100644 core/tools/tools_ui.py delete mode 100644 main.ico create mode 100644 nuitka-crash-report.xml create mode 100644 requirements.txt create mode 100644 resources/main.ico create mode 100644 resources/my.qss create mode 100644 resources/tools.ico diff --git a/.gitignore b/.gitignore index cd5504d..4c4247c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,34 @@ __pycache__/ *.pyc +*.pyo +*.pyd +.Python +*.so +*.egg +*.egg-info/ +dist/ +build/ *.spec /output - - +.venv/ +venv/ +env/ +.env +.env.local +.idea/ +.vscode/ +*.log +*.swp +*.swo +*~ +.DS_Store +.pytest_cache/ +.coverage +htmlcov/ +.ipynb_checkpoints/ +*.manifest +*.spec +config.json +*.qm +*.ts +*.trae/ \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 294db7d..0000000 --- a/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -MIT License - -Copyright (c) 2026 feifei.xu - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and -associated documentation files (the "Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial -portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO -EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 407a214..c7d5374 100644 --- a/README.md +++ b/README.md @@ -1,2 +1 @@ # Model_Team_Tools - diff --git a/build.py b/build.py new file mode 100644 index 0000000..bdea196 --- /dev/null +++ b/build.py @@ -0,0 +1,72 @@ +import os +import sys +import glob +import platform +import subprocess +from pathlib import Path +from zipfile import ZIP_DEFLATED, ZipFile + +from main import APP_NAME, APP_VERSION + +COMPILER = "mingw64" +OUTPUT_PATH = Path('output') +RESOURCES_PATH = Path("resources") +RELEASE_PATH = OUTPUT_PATH / APP_NAME + +BUILD_PATH = OUTPUT_PATH / f'{platform.system().lower()}-{platform.machine().lower()}' + + +def build_main(): + nuitka_cmd = [ + 'python', + '-m', + 'nuitka', + '--standalone', + '--show-memory', + '--show-progress', + '--plugin-enable=pyside6', + '--include-module=qt_material', + f"--include-data-dir={RESOURCES_PATH}=resources", + ] + + icon_path = str(RESOURCES_PATH / "main.ico") + if os.path.exists(icon_path): + nuitka_cmd.extend([ + f'--windows-icon-from-ico={icon_path}', + ]) + nuitka_cmd.append(f'--output-dir={BUILD_PATH}') + if platform.system() == 'Windows': + nuitka_cmd.append('--windows-console-mode=disable') + nuitka_cmd.append(f'--{COMPILER}') + + nuitka_cmd.append('./main.py') + + result = subprocess.run(nuitka_cmd,shell=True) + if result.returncode != 0: + raise RuntimeError('Nuitka building failed.') + + print('Building done.') + + +def create_zip(): + file_list = glob.glob(f'{BUILD_PATH / APP_NAME / "dist"}', recursive=True) + file_list.sort() + + if not os.path.exists(RELEASE_PATH): + os.mkdir(RELEASE_PATH) + + portable_file = RELEASE_PATH / f'{APP_NAME}-{platform.system()}-{platform.machine()}-{APP_VERSION}.zip' + print('Creating portable package...') + + with ZipFile(portable_file, 'w', compression=ZIP_DEFLATED) as zf: + for file in file_list: + file = Path(file) + name_in_zip = f'{APP_NAME}/{"/".join(file.parts[3:])}' + print(name_in_zip) + zf.write(file, name_in_zip) + + print('Creating portable package done.') + + +if __name__ == '__main__': + build_main() \ No newline at end of file diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..8ce62a7 --- /dev/null +++ b/core/__init__.py @@ -0,0 +1,18 @@ +""" +Core 模块 - 核心功能模块包 + +本包包含应用程序的核心功能组件: +- 日志系统(logging 包) +- 工具箱系统(tools 包) + +提供统一的接口导出,方便其他模块调用。 + +Author: Model Team +Version: 0.0.1 +""" + +from .logging.log import FrameLog +from .tools.tools import ToolsWindow # FromTools → ToolsWindow + +__all__ = ["FrameLog", "ToolsWindow"] + diff --git a/core/logging/log.py b/core/logging/log.py new file mode 100644 index 0000000..881bca1 --- /dev/null +++ b/core/logging/log.py @@ -0,0 +1,209 @@ +""" +日志模块 - 提供统一的日志记录功能 + +功能说明: +- 日志写入文件 (logs/log_file.log) +- 日志输出到控制台 +- 日志显示到 UI 的 TextEdit 组件 + +架构设计: +- 使用组合模式避免 PySide6 QObject.emit() 方法冲突 +- LogHandler: 独立的日志处理器,继承自 logging.Handler +- FrameLog: UI 组件,负责日志配置和显示 + +日志格式:%(asctime)s [%(levelname)s] %(message)s +时间格式:%Y-%m-%d %H:%M:%S +""" + +import logging +from pathlib import Path +from typing import Callable, Optional + +from PySide6.QtCore import QObject, Signal +from PySide6.QtWidgets import QFrame, QTextEdit + +from .log_ui import Ui_FrameLog + +# 日志配置常量 +LOG_FILE = "logs/log_file.log" # 日志文件路径 +CONSOLE_OUTPUT = True # 是否输出到控制台 + + +class LogHandler(logging.Handler): + """ + 独立的日志处理器 + + 继承自 logging.Handler,用于处理日志记录的格式化输出 + 使用回调函数机制避免与 PySide6 QObject.emit() 方法名冲突 + + 设计原因: + - logging.Handler.emit() 和 QObject.emit() 方法签名冲突 + - 使用组合模式,将回调函数作为日志传递的桥梁 + """ + + def __init__(self, callback: Callable[[str], None]) -> None: + """ + 初始化日志处理器 + + Args: + callback: 回调函数,接收格式化后的日志消息字符串 + """ + super().__init__() + self.callback = callback + + def emit(self, record: logging.LogRecord) -> None: + """ + 处理日志记录 + + 当日志系统调用此方法时,将格式化后的日志消息传递给回调函数 + + Args: + record: 日志记录对象,包含级别、消息等信息 + + 异常处理: + - RecursionError: 防止递归调用导致无限循环 + - 其他异常: 使用 handleError 记录错误 + """ + try: + msg = self.format(record) + self.callback(msg) + except RecursionError: + self.handleError(record) + except Exception: + self.handleError(record) + + +class FrameLog(QFrame, Ui_FrameLog): + """ + 日志显示框架组件 + + 继承自 QFrame(Qt 框架组件)和 Ui_FrameLog(自动生成的 UI 界面) + 负责日志系统的配置和 UI 显示功能 + + 功能: + - 初始化日志系统(文件、控制台、UI) + - 将日志消息显示到 TextEdit 组件 + - 通过信号机制实现线程安全的 UI 更新 + """ + + # PySide6 信号定义,用于跨线程传递日志消息 + log_signal = Signal(str) + + def __init__(self, parent: Optional[QObject] = None) -> None: + """ + 初始化日志框架 + + Args: + parent: 父组件对象,默认为 None + """ + QFrame.__init__(self, parent) + self.setupUi(self) + self._init_logging() + self._connect_signal() + + def _init_logging(self) -> None: + """ + 初始化日志系统 + + 配置日志系统的各个组件: + - 设置日志级别为 DEBUG + - 配置日志格式化器 + - 设置文件日志处理器(可选) + - 设置控制台日志处理器(可选) + - 配置 UI 日志处理器 + """ + logger = logging.getLogger() + logger.setLevel(logging.DEBUG) + + # 创建日志格式化器:时间 [级别] 消息 + formatter = logging.Formatter( + "%(asctime)s [%(levelname)s] %(message)s", + datefmt="%Y-%m-%d %H:%M:%S" + ) + + # 配置文件日志处理器(如果启用) + if LOG_FILE: + self._setup_file_handler(logger, formatter) + + # 配置控制台日志处理器(如果启用) + if CONSOLE_OUTPUT: + self._setup_console_handler(logger, formatter) + + # 配置 UI 日志处理器 + self._log_handler = LogHandler(self._update_log_display) + self._log_handler.setFormatter(formatter) + self._log_handler.setLevel(logging.DEBUG) + logger.addHandler(self._log_handler) + + def _setup_file_handler(self, logger: logging.Logger, formatter: logging.Formatter) -> None: + """ + 配置日志文件处理器 + + 将日志写入指定文件,支持 UTF-8 编码 + + Args: + logger: 日志记录器实例 + formatter: 日志格式化器 + + 异常处理: + - OSError: 操作系统错误(如磁盘满) + - PermissionError: 权限不足 + - 失败时降级到控制台输出 + """ + try: + log_path = Path(LOG_FILE) + log_path.parent.mkdir(parents=True, exist_ok=True) + file_handler = logging.FileHandler(log_path, encoding='utf-8') + file_handler.setFormatter(formatter) + file_handler.setLevel(logging.DEBUG) + logger.addHandler(file_handler) + except (OSError, PermissionError) as e: + logging.warning(f"无法创建日志文件 {LOG_FILE}: {e}") + logging.warning("日志将仅输出到控制台") + + def _setup_console_handler(self, logger: logging.Logger, formatter: logging.Formatter) -> None: + """ + 配置日志控制台处理器 + + 将日志输出到标准控制台(stdout) + + Args: + logger: 日志记录器实例 + formatter: 日志格式化器 + + 注意: + - 控制台输出级别设置为 INFO,只显示重要信息 + - DEBUG 级别的日志不会输出到控制台 + """ + console_handler = logging.StreamHandler() + console_handler.setFormatter(formatter) + console_handler.setLevel(logging.INFO) + logger.addHandler(console_handler) + + def _connect_signal(self) -> None: + """ + 连接日志信号到 UI 更新方法 + + 将 log_signal 信号连接到 _update_log_display 方法 + 实现日志消息的线程安全传递 + """ + self.log_signal.connect(self._update_log_display) + + def _update_log_display(self, message: str) -> None: + """ + 更新 UI 的日志显示组件 + + 将日志消息追加到 TextEdit 组件中显示 + + Args: + message: 格式化后的日志消息字符串 + + 实现细节: + - 使用 findChild 查找 TextEdit 组件 + - 使用 append 方法追加日志消息,自动换行 + """ + self.textEdit.append(message) + + # text_edit = self.findChild(QTextEdit, "textEdit") + # if text_edit: + # text_edit.append(message) \ No newline at end of file diff --git a/core/logging/log.ui b/core/logging/log.ui new file mode 100644 index 0000000..fa9722b --- /dev/null +++ b/core/logging/log.ui @@ -0,0 +1,24 @@ + + + FrameLog + + + + 0 + 0 + 982 + 300 + + + + Frame + + + + + + + + + + diff --git a/core/logging/log_ui.py b/core/logging/log_ui.py new file mode 100644 index 0000000..20d1805 --- /dev/null +++ b/core/logging/log_ui.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'log.ui' +## +## Created by: Qt User Interface Compiler version 6.8.2 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QFrame, QGridLayout, QSizePolicy, + QTextEdit, QWidget) + +class Ui_FrameLog(object): + def setupUi(self, FrameLog): + if not FrameLog.objectName(): + FrameLog.setObjectName(u"FrameLog") + FrameLog.resize(982, 300) + self.gridLayout = QGridLayout(FrameLog) + self.gridLayout.setObjectName(u"gridLayout") + self.textEdit = QTextEdit(FrameLog) + self.textEdit.setObjectName(u"textEdit") + + self.gridLayout.addWidget(self.textEdit, 0, 0, 1, 1) + + + self.retranslateUi(FrameLog) + + QMetaObject.connectSlotsByName(FrameLog) + # setupUi + + def retranslateUi(self, FrameLog): + FrameLog.setWindowTitle(QCoreApplication.translate("FrameLog", u"Frame", None)) + # retranslateUi + diff --git a/core/tools/tool_card.py b/core/tools/tool_card.py new file mode 100644 index 0000000..80ae81d --- /dev/null +++ b/core/tools/tool_card.py @@ -0,0 +1,15 @@ + +from PySide6.QtWidgets import QFrame +from .tool_card_ui import Ui_FrameToolCard + + +class ToolCard(QFrame, Ui_FrameToolCard): + """工具卡片类 + + 继承自 QFrame(Qt 帧基类)和 Ui_FrameToolCard(Qt Designer 生成的 UI 界面) + 负责显示工具的卡片界面,包含工具的图标、名称和描述。 + """ + def __init__(self, parent = None) -> None: + super().__init__(parent) + self.setupUi(self) + diff --git a/core/tools/tool_card.ui b/core/tools/tool_card.ui new file mode 100644 index 0000000..a58118b --- /dev/null +++ b/core/tools/tool_card.ui @@ -0,0 +1,90 @@ + + + FrameToolCard + + + + 0 + 0 + 491 + 64 + + + + Frame + + + + + + + + + 0 + 0 + + + + Name + + + + + + + + 0 + 0 + + + + 安装 + + + + + + + + 0 + 0 + + + + 卸载 + + + + + + + + 0 + 0 + + + + 更新 + + + + + + + + + + 0 + 0 + + + + TextLabel + + + + + + + + diff --git a/core/tools/tool_card_ui.py b/core/tools/tool_card_ui.py new file mode 100644 index 0000000..95a85e3 --- /dev/null +++ b/core/tools/tool_card_ui.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'tool_card.ui' +## +## Created by: Qt User Interface Compiler version 6.11.1 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QFrame, QGridLayout, QLabel, + QPushButton, QSizePolicy, QWidget) + +class Ui_FrameToolCard(object): + def setupUi(self, FrameToolCard): + if not FrameToolCard.objectName(): + FrameToolCard.setObjectName(u"FrameToolCard") + FrameToolCard.resize(491, 64) + self.gridLayout_2 = QGridLayout(FrameToolCard) + self.gridLayout_2.setObjectName(u"gridLayout_2") + self.gridLayout = QGridLayout() + self.gridLayout.setObjectName(u"gridLayout") + self.labelName = QLabel(FrameToolCard) + self.labelName.setObjectName(u"labelName") + sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.labelName.sizePolicy().hasHeightForWidth()) + self.labelName.setSizePolicy(sizePolicy) + + self.gridLayout.addWidget(self.labelName, 0, 0, 1, 1) + + self.pushButtonInstall = QPushButton(FrameToolCard) + self.pushButtonInstall.setObjectName(u"pushButtonInstall") + sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) + sizePolicy1.setHorizontalStretch(0) + sizePolicy1.setVerticalStretch(0) + sizePolicy1.setHeightForWidth(self.pushButtonInstall.sizePolicy().hasHeightForWidth()) + self.pushButtonInstall.setSizePolicy(sizePolicy1) + + self.gridLayout.addWidget(self.pushButtonInstall, 0, 1, 1, 1) + + self.pushButtonUninstall = QPushButton(FrameToolCard) + self.pushButtonUninstall.setObjectName(u"pushButtonUninstall") + sizePolicy1.setHeightForWidth(self.pushButtonUninstall.sizePolicy().hasHeightForWidth()) + self.pushButtonUninstall.setSizePolicy(sizePolicy1) + + self.gridLayout.addWidget(self.pushButtonUninstall, 0, 2, 1, 1) + + self.pushButtonUpdate = QPushButton(FrameToolCard) + self.pushButtonUpdate.setObjectName(u"pushButtonUpdate") + sizePolicy1.setHeightForWidth(self.pushButtonUpdate.sizePolicy().hasHeightForWidth()) + self.pushButtonUpdate.setSizePolicy(sizePolicy1) + + self.gridLayout.addWidget(self.pushButtonUpdate, 0, 3, 1, 1) + + + self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) + + self.labelInfo = QLabel(FrameToolCard) + self.labelInfo.setObjectName(u"labelInfo") + sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Expanding) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(0) + sizePolicy2.setHeightForWidth(self.labelInfo.sizePolicy().hasHeightForWidth()) + self.labelInfo.setSizePolicy(sizePolicy2) + + self.gridLayout_2.addWidget(self.labelInfo, 1, 0, 1, 1) + + + self.retranslateUi(FrameToolCard) + + QMetaObject.connectSlotsByName(FrameToolCard) + # setupUi + + def retranslateUi(self, FrameToolCard): + FrameToolCard.setWindowTitle(QCoreApplication.translate("FrameToolCard", u"Frame", None)) + self.labelName.setText(QCoreApplication.translate("FrameToolCard", u"Name", None)) + self.pushButtonInstall.setText(QCoreApplication.translate("FrameToolCard", u"\u5b89\u88c5", None)) + self.pushButtonUninstall.setText(QCoreApplication.translate("FrameToolCard", u"\u5378\u8f7d", None)) + self.pushButtonUpdate.setText(QCoreApplication.translate("FrameToolCard", u"\u66f4\u65b0", None)) + self.labelInfo.setText(QCoreApplication.translate("FrameToolCard", u"TextLabel", None)) + # retranslateUi + diff --git a/core/tools/tools.py b/core/tools/tools.py new file mode 100644 index 0000000..dee4842 --- /dev/null +++ b/core/tools/tools.py @@ -0,0 +1,86 @@ +""" +工具箱模块 + +提供工具箱主窗口,包含各种实用工具的入口。 +使用 PySide6 构建的窗口框架。 + +主要功能: +- 工具箱主窗口界面 +- 窗口居中显示功能 +- 工具分类和导航 + +Author: Model Team +Version: 0.0.1 +""" +import logging + +from qt_material import apply_stylesheet + +from pathlib import Path +from .tools_ui import Ui_FormTools +from PySide6.QtGui import QIcon +from PySide6.QtWidgets import QWidget, QApplication + +logger = logging.getLogger(__name__) + +PLUGINS_PATH = Path('Y:/SE/xufeifei/plugins') + +class ToolsWindow(QWidget, Ui_FormTools): + """工具箱主窗口类 + + 继承自 QWidget(Qt 窗口基类)和 Ui_FormTools(Qt Designer 生成的 UI 界面) + 负责显示工具箱的主界面,提供工具的分类和导航功能。 + + 窗口特性: + - 默认尺寸: 400x293 像素 + - 支持窗口居中显示 + - 可作为独立窗口或嵌入其他窗口使用 + + Attributes: + parent: 父窗口对象,默认为 None(顶级窗口) + """ + def __init__(self, parent: QWidget = None) -> None: + """初始化工具箱窗口 + + 创建工具箱窗口实例,初始化 UI 界面。 + + Args: + parent: 父窗口对象,用于建立父子关系。 + 默认为 None,表示这是顶级窗口。 + """ + super().__init__(parent) + self.setupUi(self) + + self.initUI() + self.load_stylesheet() + + def initUI(self) -> None: + """ + 初始化用户界面 + + 配置窗口标题、图标、大小和居中显示。 + """ + self.setWindowTitle("工具箱") + self.setWindowIcon(QIcon('resources/tools.ico')) + + + def load_stylesheet(self) -> None: + """ + 加载 Qt 样式表和自定义样式文件 + + 使用 qt_material 库加载暗色主题,并应用自定义 QSS 样式表 + 失败时记录错误日志,但不影响应用继续运行(降级策略) + + 异常处理: + - FileNotFoundError: 样式文件不存在 + - RuntimeError: 主题加载失败 + - 其他异常: 记录警告但不中断应用 + """ + try: + apply_stylesheet(self, style=None,theme='dark_teal.xml', css_file='resources/my.qss') + except FileNotFoundError as e: + logger.warning(f"样式文件未找到,使用默认主题: {e}") + except RuntimeError as e: + logger.warning(f"主题加载失败,使用默认主题: {e}") + except Exception as e: + logger.warning(f"样式加载失败,使用默认主题: {e}") diff --git a/core/tools/tools.ui b/core/tools/tools.ui new file mode 100644 index 0000000..a7d278c --- /dev/null +++ b/core/tools/tools.ui @@ -0,0 +1,30 @@ + + + FormTools + + + + 0 + 0 + 810 + 423 + + + + + 0 + 0 + + + + Form + + + + + + + + + + diff --git a/core/tools/tools_ui.py b/core/tools/tools_ui.py new file mode 100644 index 0000000..385a34d --- /dev/null +++ b/core/tools/tools_ui.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'tools.ui' +## +## Created by: Qt User Interface Compiler version 6.11.1 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QGridLayout, QListWidget, QListWidgetItem, + QSizePolicy, QWidget) + +class Ui_FormTools(object): + def setupUi(self, FormTools): + if not FormTools.objectName(): + FormTools.setObjectName(u"FormTools") + FormTools.resize(810, 423) + sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(FormTools.sizePolicy().hasHeightForWidth()) + FormTools.setSizePolicy(sizePolicy) + self.gridLayout = QGridLayout(FormTools) + self.gridLayout.setObjectName(u"gridLayout") + self.listWidget = QListWidget(FormTools) + self.listWidget.setObjectName(u"listWidget") + + self.gridLayout.addWidget(self.listWidget, 0, 0, 1, 1) + + + self.retranslateUi(FormTools) + + QMetaObject.connectSlotsByName(FormTools) + # setupUi + + def retranslateUi(self, FormTools): + FormTools.setWindowTitle(QCoreApplication.translate("FormTools", u"Form", None)) + # retranslateUi + diff --git a/main.ico b/main.ico deleted file mode 100644 index bad03adf52132d0d11f5d948d4c4b382fa657353..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32543 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

Yg1@){V72zB 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 diff --git a/main.py b/main.py index 793250a..20925da 100644 --- a/main.py +++ b/main.py @@ -1,27 +1,122 @@ +""" +Model Team Tools - 主程序入口 + +应用程序主窗口的初始化和配置模块 +使用 PySide6 构建的桌面应用程序框架 + +主要功能: +- 初始化 Qt 主窗口 +- 加载 Qt Material 样式表 +- 配置菜单栏和状态栏 +- 提供统一的日志记录接口 +""" import sys +import importlib +import logging +import core +import traceback -from PySide6.QtGui import * -from PySide6.QtCore import * -from PySide6.QtWidgets import * +from pathlib import Path + +from typing import Optional +from PySide6.QtGui import QIcon +from PySide6.QtWidgets import QApplication, QMainWindow, QMenuBar, QStatusBar,QFileDialog from qt_material import apply_stylesheet - from main_ui import Ui_MainWindow +# 获取模块日志记录器 +logger = logging.getLogger(__name__) + +# 版本号常量 +MAJOR_VER: int = 0 # 主版本号 +MINOR_VER: int = 0 # 次版本号 +MICRO_VER: int = 1 # 修订版本号 + +APP_NAME: str = "Model Team Tools" +APP_VERSION: str = f"{MAJOR_VER}.{MINOR_VER}.{MICRO_VER}" -class MainWindow(QMainWindow,Ui_MainWindow): - def __init__(self): +class MainWindow(QMainWindow, Ui_MainWindow): + """ + 主窗口类 + + 继承自 QMainWindow(Qt 主窗口基类)和 Ui_MainWindow(Qt Designer 生成的 UI 界面) + 负责应用程序主窗口的初始化、样式配置和界面布局 + """ + + def __init__(self) -> None: super().__init__() self.setupUi(self) - self.initUI() - def initUI(self): - self.setWindowIcon(QIcon("main.ico")) - self.setWindowTitle("Model Team Tools") + def initUI(self) -> None: + """ + 初始化用户界面组件 + + 执行以下初始化操作: + - 加载 Qt 样式表和自定义样式 + - 设置窗口标题 + - 配置菜单栏 + - 配置状态栏 + - 记录初始化日志 + + 注意:此方法在主窗口创建后调用 + """ + self.load_stylesheet() + self.setWindowTitle(APP_NAME) + self.setWindowIcon(QIcon('resources/main.ico')) + self.menubar: Optional[QMenuBar] = self.menuBar() + self.statusbar: QStatusBar = self.statusBar() + self.statusbar.showMessage(f"Version: {APP_VERSION}") + + self.action_tools.triggered.connect(self.on_tools) + + def load_stylesheet(self) -> None: + """ + 加载 Qt 样式表和自定义样式文件 + + 使用 qt_material 库加载暗色主题,并应用自定义 QSS 样式表 + 失败时记录错误日志,但不影响应用继续运行(降级策略) + + 异常处理: + - FileNotFoundError: 样式文件不存在 + - RuntimeError: 主题加载失败 + - 其他异常: 记录警告但不中断应用 + """ + try: + apply_stylesheet(self, style=None,theme='dark_teal.xml', css_file='resources/my.qss') + except FileNotFoundError as e: + logger.warning(f"样式文件未找到,使用默认主题: {e}") + except RuntimeError as e: + logger.warning(f"主题加载失败,使用默认主题: {e}") + except Exception as e: + logger.warning(f"样式加载失败,使用默认主题: {e}") + + def on_tools(self) -> None: + """打开工具箱窗口 + + 创建并显示工具箱窗口实例。包含完整的错误处理机制, + 确保任何异常都不会导致主程序崩溃。 + + 异常处理: + - 捕获所有异常并记录到日志 + - 显示详细的错误堆栈信息 + - 不影响主窗口的正常使用 + + 日志记录: + - 成功打开工具箱时记录 INFO 级别日志 + - 打开失败时记录 ERROR 级别日志 + """ + try: + self.tools = core.ToolsWindow() + self.tools.show() + logger.info("工具箱窗口已打开") + except Exception as e: + logger.error(f"无法打开工具箱窗口: {e}") + logger.error(traceback.format_exc()) if __name__ == '__main__': - app = QApplication([]) - main = MainWindow() + app = QApplication(sys.argv) + main: MainWindow = MainWindow() main.show() - sys.exit(app.exec()) + sys.exit(app.exec()) \ No newline at end of file diff --git a/main.ui b/main.ui index 31ffdca..1158c13 100644 --- a/main.ui +++ b/main.ui @@ -6,8 +6,8 @@ 0 0 - 800 - 600 + 1200 + 900 @@ -18,6 +18,28 @@ + + + + + 0 + 0 + + + + + 16777215 + 250 + + + + QFrame::Shape::StyledPanel + + + QFrame::Shadow::Raised + + + @@ -25,25 +47,47 @@ 0 0 - 800 + 1200 21 - File + 文件 - + - + + + toolBar + + + TopToolBarArea + + + false + + + - Config + 工具箱 + + + QAction::MenuRole::NoRole + + + FrameLog + QFrame +

core.h
+ 1 + + diff --git a/main_ui.py b/main_ui.py index b6ce4cb..f5ed970 100644 --- a/main_ui.py +++ b/main_ui.py @@ -3,7 +3,7 @@ ################################################################################ ## Form generated from reading UI file 'main.ui' ## -## Created by: Qt User Interface Compiler version 6.8.2 +## Created by: Qt User Interface Compiler version 6.11.1 ## ## WARNING! All changes made in this file will be lost when recompiling UI file! ################################################################################ @@ -16,17 +16,20 @@ from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient, QIcon, QImage, QKeySequence, QLinearGradient, QPainter, QPalette, QPixmap, QRadialGradient, QTransform) -from PySide6.QtWidgets import (QApplication, QGridLayout, QMainWindow, QMenu, - QMenuBar, QSizePolicy, QStackedWidget, QStatusBar, - QWidget) +from PySide6.QtWidgets import (QApplication, QFrame, QGridLayout, QMainWindow, + QMenu, QMenuBar, QSizePolicy, QStackedWidget, + QStatusBar, QToolBar, QWidget) + +from core import FrameLog class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") - MainWindow.resize(800, 600) - self.actionconfigs = QAction(MainWindow) - self.actionconfigs.setObjectName(u"actionconfigs") + MainWindow.resize(1200, 900) + self.action_tools = QAction(MainWindow) + self.action_tools.setObjectName(u"action_tools") + self.action_tools.setMenuRole(QAction.MenuRole.NoRole) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.gridLayout = QGridLayout(self.centralwidget) @@ -36,19 +39,35 @@ class Ui_MainWindow(object): self.gridLayout.addWidget(self.stackedWidget, 0, 0, 1, 1) + self.frame = FrameLog(self.centralwidget) + self.frame.setObjectName(u"frame") + sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth()) + self.frame.setSizePolicy(sizePolicy) + self.frame.setMaximumSize(QSize(16777215, 250)) + self.frame.setFrameShape(QFrame.Shape.StyledPanel) + self.frame.setFrameShadow(QFrame.Shadow.Raised) + + self.gridLayout.addWidget(self.frame, 1, 0, 1, 1) + MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") - self.menubar.setGeometry(QRect(0, 0, 800, 21)) + self.menubar.setGeometry(QRect(0, 0, 1200, 21)) self.menu = QMenu(self.menubar) self.menu.setObjectName(u"menu") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName(u"statusbar") MainWindow.setStatusBar(self.statusbar) + self.toolBar = QToolBar(MainWindow) + self.toolBar.setObjectName(u"toolBar") + MainWindow.addToolBar(Qt.ToolBarArea.TopToolBarArea, self.toolBar) self.menubar.addAction(self.menu.menuAction()) - self.menu.addAction(self.actionconfigs) + self.menu.addAction(self.action_tools) self.retranslateUi(MainWindow) @@ -57,7 +76,8 @@ class Ui_MainWindow(object): def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) - self.actionconfigs.setText(QCoreApplication.translate("MainWindow", u"Config", None)) - self.menu.setTitle(QCoreApplication.translate("MainWindow", u"File", None)) + self.action_tools.setText(QCoreApplication.translate("MainWindow", u"\u5de5\u5177\u7bb1", None)) + self.menu.setTitle(QCoreApplication.translate("MainWindow", u"\u6587\u4ef6", None)) + self.toolBar.setWindowTitle(QCoreApplication.translate("MainWindow", u"toolBar", None)) # retranslateUi diff --git a/nuitka-crash-report.xml b/nuitka-crash-report.xml new file mode 100644 index 0000000..6d273c3 --- /dev/null +++ b/nuitka-crash-report.xml @@ -0,0 +1,7481 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8842134 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +PySide6>=6.0.0 +Nuitka==2.6.6 +qt_material>=0.1.1 +logging>=0.1.0 \ No newline at end of file diff --git a/resources/main.ico b/resources/main.ico new file mode 100644 index 0000000000000000000000000000000000000000..29d34822d371a02deabe76f6bb371076494fc3d5 GIT binary patch literal 41190 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 literal 0 HcmV?d00001 diff --git a/resources/my.qss b/resources/my.qss new file mode 100644 index 0000000..4e3bd87 --- /dev/null +++ b/resources/my.qss @@ -0,0 +1,19 @@ +* {{ + color: #ffffffff !important; + font: 16px "SimSun" !important; + text-transform: none; +}} + +QPushButton {{ + text-transform: none; +}} + +QTabBar::tab {{ + text-transform: none; +}} + +QTextEdit {{ + color: #ffffffff !important; + font: 16px "SimSun" !important; + text-transform: none; +}} \ No newline at end of file diff --git a/resources/tools.ico b/resources/tools.ico new file mode 100644 index 0000000000000000000000000000000000000000..0512c3e860701e9f1a39f8ea5a3b824d9b9fb8dd GIT binary patch literal 5014 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