上传文件至 /

第一次提交

Signed-off-by: hujinyang <hujinyang@pw.com>
This commit is contained in:
hujinyang 2025-12-03 07:42:43 +00:00
parent 47cd5d5151
commit 7391a4b29b
5 changed files with 2349 additions and 0 deletions

208
README.md Normal file
View File

@ -0,0 +1,208 @@
Config Editor - 配置文件编辑工具
一个基于PyQt6开发的Python配置文件可视化编辑工具支持自动解析Python配置文件中的大写变量提供直观的GUI界面进行编辑和管理。
✨ 特性功能
🎯 核心功能
智能解析自动扫描Python文件识别文件中的变量配置项
可视化编辑基于PyQt6的现代化GUI界面支持多种数据类型编辑
分组管理:可自定义分组,按类别组织配置项
格式保持:保存时保持原始文件格式、注释和缩进
🔧 编辑支持
多种数据类型:
布尔值CheckBox
整数/浮点数SpinBox
字符串LineEdit/TextEdit
JSON/字典/列表(格式化编辑)
校验规则:
必填项验证
数值范围限制
正则表达式匹配
自定义错误提示
📊 管理功能
显示定制:自定义每个配置项的显示名称和提示信息
字段隐藏:标记隐藏字段,支持显示/隐藏切换
类型推断:自动识别字段类型,支持手动覆盖
规则管理:独立的规则管理界面,支持批量配置
🚀 快速开始
环境要求
Python 3.8+
PyQt6
构建打包
执行build.sh脚本
安装部署
bash
1.sudo dpkg -i config-editor_1.0_amd64.deb
2.sudo /usr/share/config-editor/setup_venv.sh
在服务器图形化界面搜索Config Editor点击即可使用
卸载程序
bash
1.sudo dpkg -r config-editor
📁 项目结构
text
config_editor/
├── config_editor.py # 主程序
├── config_editor_rules.json # 规则配置文件
├── config_editor_settings.json # 用户设置文件
├── build.sh # 一键打包脚本
├── CHANGELOG.md # 变更日志
└── README.md # 说明文档
配置文件说明
config_editor_rules.json存储所有配置项的元数据分组、显示名、校验规则等
config_editor_settings.json存储用户设置最近使用的配置文件路径等
🖥️ 使用指南
1. 首次运行
首次启动程序时,会自动弹出配置文件设置对话框:
选择要编辑的Python配置文件
程序会自动解析配置文件中的大写变量
2. 界面布局
顶部信息栏:显示当前配置文件的路径
标签页:按分组显示配置项
编辑区域:每个配置项包含:
显示名称(可自定义)
编辑控件(根据类型自动适配)
变量名(原始名称)
工具栏:常用操作按钮
3. 基本操作
打开文件:使用菜单或按钮打开其他配置文件
编辑配置:直接在对应的控件中修改值
保存配置:保存修改到原配置文件
重新加载:放弃修改,重新读取配置文件
4. 高级功能
规则管理
点击"管理规则"按钮进入规则管理界面:
字段属性:设置显示名称、分组、类型、提示信息等
校验规则:设置最小值、最大值、正则表达式、必填项
分组管理:添加、删除分组,调整字段分组
字段筛选
搜索功能:快速查找配置项
隐藏字段:支持显示/隐藏被标记为隐藏的配置项
⚙️ 配置规则详解
分组配置
json
"categories": {
"数据库配置": ["DB_HOST", "DB_PORT"],
"应用配置": ["DEBUG_MODE", "LOG_LEVEL"]
}
字段属性
json
"display_names": {
"DB_HOST": "数据库主机地址"
},
"field_types": {
"DB_PORT": "int"
},
"tooltips": {
"DB_HOST": "请输入数据库服务器的IP地址或域名"
}
校验规则
json
"validations": {
"DB_PORT": {
"required": true,
"min": "1024",
"max": "65535",
"regex": "^[0-9]+$"
}
}
🎨 支持的Python配置文件格式
程序可以解析以下格式的配置:
python
# 配置文件示例 config.py
DB_HOST = "localhost" # 数据库地址
DB_PORT = 3306 # 数据库端口
DEBUG_MODE = True # 调试模式
MAX_CONNECTIONS = 100 # 最大连接数
要求:
配置变量名必须为大写字母和下划线组成
支持Python基本数据类型字符串、数字、布尔值、列表、字典
🔍 技术实现
解析技术
使用Python的ast模块进行语法分析
精确识别配置项的位置和注释
保持原始格式和缩进
GUI框架
基于PyQt6构建现代化界面
响应式布局,支持调整窗口大小
自定义控件适配不同数据类型
数据持久化
规则配置使用JSON格式存储
支持相对路径和绝对路径
自动保存用户设置
📝 使用示例
编辑配置文件
启动程序,选择配置文件
在对应的分组中找到要修改的配置项
编辑值(复选框、数字框、文本框等)
点击"保存配置"按钮
确认变更后,程序会自动更新配置文件
自定义规则
点击"管理规则"按钮
在左侧列表选择配置项
在右侧设置显示名称、分组、类型等
设置校验规则(可选)
保存规则,程序会自动重新加载界面

320
build.sh Normal file
View File

@ -0,0 +1,320 @@
# config Editor 一键构建脚本
set -e
# 配置变量
PACKAGE_NAME="config-editor"
VERSION="1.0"
ARCHITECTURE="amd64"
MAINTAINER="hjy <hjy@pw.com>"
echo "=========================================="
echo "Config Editor 构建脚本 (虚拟环境版)"
echo "版本: $VERSION"
echo "架构: $ARCHITECTURE"
echo "=========================================="
# 检查依赖
echo "检查构建依赖..."
if ! command -v dpkg-deb &> /dev/null; then
echo "错误: 需要 dpkg-deb请安装: sudo apt install dpkg-dev"
exit 1
fi
# 检查源代码是否存在
echo "检查源代码..."
if [ ! -f "config_editor.py" ]; then
echo "错误: 未找到主程序文件 config_editor.py"
echo "请确保在项目根目录运行此脚本,且包含 config_editor.py 文件"
exit 1
fi
# 创建构建目录
BUILD_DIR="/tmp/${PACKAGE_NAME}-build"
echo "创建构建目录: $BUILD_DIR"
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR/DEBIAN"
mkdir -p "$BUILD_DIR/usr/share/applications"
mkdir -p "$BUILD_DIR/usr/share/config-editor"
mkdir -p "$BUILD_DIR/usr/bin"
# 复制应用文件
echo "复制应用文件..."
echo "复制主程序 config_editor.py"
cp config_editor.py "$BUILD_DIR/usr/share/config-editor/"
# 复制配置文件
if [ -f "config_editor_rules.json" ]; then
echo "复制配置文件 config_editor_rules.json"
cp config_editor_rules.json "$BUILD_DIR/usr/share/config-editor/"
else
echo "警告: 未找到 config_editor_rules.json 文件"
fi
if [ -f "config_editor_settings.json" ]; then
echo "复制配置文件 config_editor_settings.json"
cp config_editor_settings.json "$BUILD_DIR/usr/share/config-editor/"
else
echo "警告: 未找到 config_editor_settings.json 文件"
fi
# 复制所有Python文件
echo "复制其他Python文件..."
find . -maxdepth 1 -name "*.py" ! -name "build.sh" -exec cp {} "$BUILD_DIR/usr/share/config-editor/" \; 2>/dev/null || true
# 显示复制的文件
echo "已复制的文件:"
ls -la "$BUILD_DIR/usr/share/config-editor/"
# 检查是否复制了真实的应用文件
if [ ! -f "$BUILD_DIR/usr/share/config-editor/config_editor.py" ]; then
echo "错误: 未成功复制 config_editor.py 文件"
exit 1
fi
# 创建桌面文件
echo "创建桌面文件..."
cat > "$BUILD_DIR/usr/share/applications/config-editor.desktop" << EOF
[Desktop Entry]
Version=1.1
Type=Application
Name=Config Editor
Comment=Configuration Management System
Exec=config-editor
Icon=config-editor
Categories=Development;Settings;
Terminal=false
StartupWMClass=ConfigEditor
EOF
# 创建虚拟环境安装脚本(已修复权限问题)
echo "创建虚拟环境安装脚本..."
cat > "$BUILD_DIR/usr/share/config-editor/setup_venv.sh" << 'EOF'
#!/bin/bash
# 虚拟环境安装脚本
APP_DIR="/usr/share/config-editor"
VENV_DIR="$APP_DIR/venv"
echo "设置Config Editor虚拟环境..."
# 检查是否使用sudo
if [ "$EUID" -ne 0 ]; then
echo "错误: 请使用sudo运行此脚本"
echo "命令: sudo $0"
exit 1
fi
# 检查虚拟环境是否存在
if [ ! -d "$VENV_DIR" ]; then
echo "创建虚拟环境..."
python3 -m venv --system-site-packages "$VENV_DIR"
if [ $? -ne 0 ]; then
echo "错误: 无法创建虚拟环境"
echo "请确保已安装 python3-venv: sudo apt install python3-venv"
exit 1
fi
fi
# 激活虚拟环境并安装依赖
echo "激活虚拟环境并安装依赖..."
source "$VENV_DIR/bin/activate"
# 修复权限问题
echo "修复虚拟环境权限..."
chmod -R 755 "$VENV_DIR"
chmod +x "$VENV_DIR/bin"/* 2>/dev/null || true
chmod +x "$VENV_DIR/bin/python" 2>/dev/null || true
chmod +x "$VENV_DIR/bin/pip" 2>/dev/null || true
# 升级pip
echo "升级pip..."
python -m pip install --upgrade pip
# 安装PyQt6
echo "安装PyQt6..."
pip install PyQt6 -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 如果有requirements.txt安装其他依赖
if [ -f "$APP_DIR/requirements.txt" ]; then
echo "安装其他依赖..."
pip install -r "$APP_DIR/requirements.txt" -i https://pypi.tuna.tsinghua.edu.cn/simple/
fi
# 再次确保权限正确
echo "设置最终权限..."
chmod -R 755 "$VENV_DIR"
chmod +x "$VENV_DIR/bin"/* 2>/dev/null || true
echo "虚拟环境设置完成"
echo "安装在虚拟环境中的包:"
pip list
EOF
chmod +x "$BUILD_DIR/usr/share/config-editor/setup_venv.sh"
# 创建启动脚本 - 使用虚拟环境(已修复权限检查)
echo "创建启动脚本..."
cat > "$BUILD_DIR/usr/bin/config-editor" << 'EOF'
#!/bin/bash
# Config Editor 启动脚本 - 虚拟环境版本
# 应用目录
APP_DIR="/usr/share/config-editor"
VENV_DIR="$APP_DIR/venv"
LOG_FILE="${HOME}/.config/config-editor/log.txt"
# 创建日志目录
mkdir -p "$(dirname "$LOG_FILE")"
# 记录启动日志
echo "$(date): 启动Config Editor" >> "$LOG_FILE"
# 设置环境变量
export DISPLAY=":${XDG_SESSION_DISPLAY:-1}"
export XAUTHORITY="${HOME}/.Xauthority"
# 尝试多种方法设置DBUS
if [ -f "/run/user/$(id -u)/bus" ]; then
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus"
elif [ -n "$DBUS_SESSION_BUS_ADDRESS" ]; then
: # 保持已有设置
else
# 尝试从进程获取
DBUS_ADDR=$(ps -u $(id -u) -o command | grep -o 'dbus-daemon.*address=unix:path=[^ ]*' | head -1 | sed 's/.*address=//')
if [ -n "$DBUS_ADDR" ]; then
export DBUS_SESSION_BUS_ADDRESS="$DBUS_ADDR"
fi
fi
# 修复X11权限
if [ -f "${HOME}/.Xauthority" ]; then
export XAUTHORITY="${HOME}/.Xauthority"
fi
# 检查虚拟环境
if [ ! -d "$VENV_DIR" ]; then
echo "错误: 虚拟环境未找到。请先运行:"
echo " sudo /usr/share/config-editor/setup_venv.sh"
exit 1
fi
# 检查并修复权限(如果需要)
if [ ! -x "$VENV_DIR/bin/python" ] || [ ! -x "$VENV_DIR/bin/pip" ]; then
echo "警告: 虚拟环境权限问题,请重新运行安装脚本:"
echo " sudo /usr/share/config-editor/setup_venv.sh"
exit 1
fi
# 检查PyQt6是否安装
if ! "$VENV_DIR/bin/python" -c "import PyQt6" 2>/dev/null; then
echo "错误: PyQt6未在虚拟环境中安装。请运行:"
echo " sudo /usr/share/config-editor/setup_venv.sh"
exit 1
fi
# 切换到应用目录
cd "$APP_DIR"
# 记录环境信息
echo "DISPLAY: $DISPLAY" >> "$LOG_FILE"
echo "XAUTHORITY: $XAUTHORITY" >> "$LOG_FILE"
# 使用虚拟环境运行Python应用
exec "$VENV_DIR/bin/python" config_editor.py "$@" >> "$LOG_FILE" 2>&1
EOF
chmod +x "$BUILD_DIR/usr/bin/config-editor"
# 创建控制文件
echo "创建DEBIAN控制文件..."
cat > "$BUILD_DIR/DEBIAN/control" << EOF
Package: $PACKAGE_NAME
Version: $VERSION
Architecture: $ARCHITECTURE
Depends: python3, python3-venv
Recommends: libnotify-bin, x11-xserver-utils
Maintainer: $MAINTAINER
Description: Configuration Management System (VirtualEnv)
A PyQt6-based configuration management editor using virtual environment.
Provides grouping management, validation rules, and auto-grouping features.
This version uses virtual environment for PyQt6.
EOF
# 创建安装后脚本
echo "创建安装后脚本..."
cat > "$BUILD_DIR/DEBIAN/postinst" << 'EOF'
#!/bin/bash
# 安装后脚本
set -e
echo "Config Editor 安装完成!"
echo ""
echo "更新桌面数据库..."
update-desktop-database /usr/share/applications 2>/dev/null || true
echo ""
echo "重要: 需要设置虚拟环境才能运行应用"
echo "请执行以下命令完成安装:"
echo " sudo /usr/share/config-editor/setup_venv.sh"
echo ""
echo "使用说明:"
echo "1. 设置虚拟环境: sudo /usr/share/config-editor/setup_venv.sh"
echo "2. 在终端运行: config-editor"
# 设置文件权限
chmod 755 /usr/bin/config-editor
chmod 755 /usr/share/config-editor/setup_venv.sh
# 设置应用文件权限
chmod -R 644 /usr/share/config-editor/* 2>/dev/null || true
chmod 755 /usr/share/config-editor/*.py 2>/dev/null || true
chmod 755 /usr/share/config-editor/*.sh 2>/dev/null || true
# 为虚拟环境目录预留权限
mkdir -p /usr/share/config-editor/venv 2>/dev/null || true
chmod 755 /usr/share/config-editor/venv 2>/dev/null || true
exit 0
EOF
chmod +x "$BUILD_DIR/DEBIAN/postinst"
# 构建deb包
echo "构建deb包..."
dpkg-deb --build "$BUILD_DIR" "${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb"
# 验证包
echo "验证deb包..."
if dpkg -I "${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb" > /dev/null; then
echo "✓ 包验证成功"
else
echo "✗ 包验证失败"
exit 1
fi
# 清理构建目录
echo "清理构建目录..."
rm -rf "$BUILD_DIR"
echo ""
echo "=========================================="
echo "构建成功完成!"
echo "生成的deb包: ${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb"
echo ""
echo "安装步骤:"
echo "1. 安装deb包: sudo dpkg -i ${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb"
echo "2. 安装依赖(如有需要): sudo apt install -f"
echo "3. 设置虚拟环境: sudo /usr/share/config-editor/setup_venv.sh"
echo ""
echo "此版本特点:"
echo "✓ 修复了虚拟环境权限问题"
echo "✓ 使用 --system-site-packages 参数"
echo "✓ 自动使用清华PyPI镜像"
echo "✓ 简化了依赖和脚本"
echo "=========================================="
# 显示包信息
echo ""
echo "包信息:"
dpkg -I "${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb"

1686
config_editor.py Normal file

File diff suppressed because it is too large Load Diff

131
config_editor_rules.json Normal file
View File

@ -0,0 +1,131 @@
{
"categories": {
"数据库配置": [
"CONNECTION",
"REDIS_ADDRESS",
"REDIS_PORT",
"SYNC_INTERVAL",
"REDIS_FIELD_MAPPING"
],
"PLC控制": [
"PLC_ADDRESS",
"PLC_PORT",
"NH3_LOWER",
"NH3_UPPER",
"IS_AUTO",
"AI_NH3_ADDRESS",
"FLOW_FEEDBACK_ADDRESS",
"NH3_MANUAL"
],
"训练参数": [
"RESAMPLE_SIZE",
"MISSING_VALUE_LENGTH",
"MEAN_MASE",
"INTERVAL_SIZE_V2",
"LAGS",
"PREDICT_FH_V2",
"TRAIN_DAYS_V2",
"THREAD_COUNT",
"GPU_RAM_PART",
"CNF_PREDICT_NUMBER",
"CNF_LAGS",
"CNF_LAGS_PC",
"CNF_OUTPUT_CHUNK_LENGTH",
"CNF_THREAD_COUNT",
"CNF_ALARM_LEVEL_1",
"CNF_ALARM_LEVEL_2",
"CNF_ALARM_LEVEL_3"
],
"计算参数": [
"NH3_LOWER",
"NH3_UPPER",
"SMOKE_VOLUME",
"SMOKE_VOLUME_UPPER",
"SMOKE_VOLUME_LOWER",
"CONC",
"DENSITY",
"IS_SOLUTION",
"DECLINE_LIMIT",
"LOWER_LIMIT_DURATION",
"RAISE_LIMIT",
"UPPER_LIMIT_DURATION",
"PAS_TARGET",
"ACTUAL_PAS_TARGET_DIFF_CEMS",
"ACTUAL_PAS_TARGET_DIFF_PW",
"ACTUAL_PAS_TARGET_CEMS",
"ACTUAL_PAS_TARGET_PW",
"DYNAMIC_TARGET_UPPER",
"DYNAMIC_TARGET_LOWER",
"DYNAMIC_TARGET_START_MINUTE",
"DYNAMIC_TARGET_END_MINUTE",
"NH3_MANUAL"
],
"控制修正": [
"OUT_NH3_TARGET",
"OUT_NH3_TARGET_LOWER",
"OUT_NH3_TARGET_UPPER",
"CORR_PER_LIMIT",
"CORR_SLOPE",
"AVG_PRIMARY_ADJUST_TIME",
"PRIMARY_ADJUST_THRESHOLD",
"PRIMARY_ADJUST_INC_MULT",
"PRIMARY_ADJUST_DEC_MULT",
"CONTROL_METHOD_THRESHOLD",
"AVG_CORR_NOX_THRESHOLD",
"AVG_SMOKE_ADJUST_TIME",
"PRIMARY_ADJUST_SWITCH",
"SECONDARY_ADJUST_SWITCH",
"AVG_PRED_NOX_ADJUST_TIME",
"ADVANCE_TIME",
"BLOWBACK_TIME",
"EFFICIENCY",
"EFFICIENCY_ADJUST_INTERVAL",
"EFFICIENCY_ADJUST_ADVANCE_TIME",
"AVG_EFFICIENCY_ADJUST_TIME",
"EFFICIENCY_ADJUST_THRESHOLD",
"EFFICIENCY_ADJUST_UPPER",
"EFFICIENCY_ADJUST_LOWER",
"CORR_SLOPE_2",
"OUT_NH3_ADJUST_SWITCH",
"OUT_NH3_ADJUST_THRESHOLD",
"OUT_NH3_ADJUST_PCT"
],
"PID控制": [
"PID_VALVE_IS_AUTO",
"PID_VALVE_LOWER",
"PID_VALVE_UPPER",
"PID_VALVE_MANUAL",
"PID_VALVE_AUTO_ADDRESS",
"PID_VALVE_READ_ADDRESS",
"PID_VALVE_MANUAL_ADDRESS",
"PID_VALVE_FEEDBACK_ADDRESS"
],
"MQTT配置": [
"MQTT_HOST",
"MQTT_PORT",
"MQTT_USERNAME",
"MQTT_PASSWORD",
"MQTT_TOPIC",
"MQTT_CLIENT_ID"
],
"其他配置": [
"VALVE_UPPER",
"VALVE_LOWER",
"MODEL_CHANNEL",
"CLEAN_UPPER",
"CLEAN_LOWER",
"ALARM_WEBHOOK",
"ABS_DIFF_THRESHOLD"
],
"未分类": [
"EMERGENCY_ADJUST_INC_MULT",
"USED_RAM_LIMIT"
]
},
"display_names": {
"ABS_DIFF_THRESHOLD": "两个出口NOx绝对值误差阈值"
},
"tooltips": {},
"field_types": {},
"hidden": []
}

View File

@ -0,0 +1,4 @@
{
"config_file_path": "",
"last_used": ""
}