diff --git a/LinuxGrubRepair.bin.spec b/LinuxGrubRepair.bin.spec
new file mode 100644
index 0000000..d949235
--- /dev/null
+++ b/LinuxGrubRepair.bin.spec
@@ -0,0 +1,38 @@
+# -*- mode: python ; coding: utf-8 -*-
+
+
+a = Analysis(
+ ['frontend.py'],
+ pathex=[],
+ binaries=[],
+ datas=[],
+ hiddenimports=[],
+ hookspath=[],
+ hooksconfig={},
+ runtime_hooks=[],
+ excludes=[],
+ noarchive=False,
+ optimize=0,
+)
+pyz = PYZ(a.pure)
+
+exe = EXE(
+ pyz,
+ a.scripts,
+ a.binaries,
+ a.datas,
+ [],
+ name='LinuxGrubRepair.bin',
+ debug=False,
+ bootloader_ignore_signals=False,
+ strip=False,
+ upx=True,
+ upx_exclude=[],
+ runtime_tmpdir=None,
+ console=True,
+ disable_windowed_traceback=False,
+ argv_emulation=False,
+ target_arch=None,
+ codesign_identity=None,
+ entitlements_file=None,
+)
diff --git a/arch-install.sh b/arch-install.sh
new file mode 100755
index 0000000..d041107
--- /dev/null
+++ b/arch-install.sh
@@ -0,0 +1,394 @@
+#!/bin/bash
+
+# ==============================================================================
+# BootRepairTool - Arch Linux 源码安装脚本
+# ------------------------------------------------------------------------------
+# 功能:
+# 1. 自动安装依赖 (git, tk, python)
+# 2. 克隆项目到 /opt/boot-repair-tool
+# 3. 创建启动脚本和桌面入口
+# 4. 提示用户如何运行
+#
+# 使用方式:
+#
+# 方式一:从 Git 仓库安装(默认)
+# 默认会从 GitHub 克隆最新版本:
+# sudo bash arch-install.sh
+#
+# 或指定自定义仓库地址:
+# sudo bash arch-install.sh git https://github.com/username/repo.git
+#
+# 方式二:本地安装(离线)
+# 将项目文件夹复制到 Arch Linux 系统,进入目录运行:
+# sudo bash arch-install.sh local
+#
+# 注意: 使用前请修改脚本中的 DEFAULT_REPO_URL 为实际仓库地址
+# ==============================================================================
+
+# --- 配置变量 ---
+APP_NAME="Linux GRUB 引导修复工具"
+APP_NAME_EN="BootRepairTool"
+# 默认 Git 仓库地址(请修改为实际地址)
+DEFAULT_REPO_URL="https://git.yuyujing.cn/zj/BootRepairTool.git"
+# 安装模式: "git" 或 "local"
+INSTALL_MODE="${1:-git}"
+# 可以通过第二个参数指定自定义仓库地址
+CUSTOM_REPO_URL="${2:-}"
+INSTALL_DIR="/opt/boot-repair-tool"
+EXEC_FILE="boot-repair"
+DESKTOP_FILE_NAME="boot-repair.desktop"
+DESKTOP_INSTALL_DIR="/usr/share/applications"
+POLICY_FILE="/usr/share/polkit-1/actions/com.bootrepair.tool.policy"
+ICON_FILE="boot-repair.png"
+
+# --- 颜色定义 ---
+GREEN='\033[0;32m'
+RED='\033[0;31m'
+YELLOW='\033[0;33m'
+BLUE='\033[0;34m'
+CYAN='\033[0;36m'
+NC='\033[0m'
+
+# 检查是否以 root 权限运行
+check_root() {
+ if [[ $EUID -ne 0 ]]; then
+ echo -e "${RED}错误:此脚本需要 root 权限运行。请使用 'sudo bash $0'。${NC}"
+ exit 1
+ fi
+}
+
+# 检查并安装依赖
+install_dependencies() {
+ echo -e "${YELLOW}[1/6] 检查并安装依赖...${NC}"
+
+ # 更新包数据库
+ echo -e "${BLUE} 更新包数据库...${NC}"
+ pacman -Sy --noconfirm
+
+ # 需要安装的包
+ PACKAGES="git tk python python-pip"
+
+ for pkg in $PACKAGES; do
+ if pacman -Q "$pkg" &>/dev/null; then
+ echo -e "${GREEN} ✓ $pkg 已安装${NC}"
+ else
+ echo -e "${YELLOW} 正在安装 $pkg...${NC}"
+ pacman -S --noconfirm "$pkg"
+ if [ $? -eq 0 ]; then
+ echo -e "${GREEN} ✓ $pkg 安装成功${NC}"
+ else
+ echo -e "${RED} ✗ $pkg 安装失败${NC}"
+ exit 1
+ fi
+ fi
+ done
+}
+
+# 克隆或更新项目
+clone_or_update_project() {
+ echo -e "${YELLOW}[2/6] 安装项目文件...${NC}"
+
+ # 确定仓库地址
+ if [ -n "$CUSTOM_REPO_URL" ]; then
+ REPO_URL="$CUSTOM_REPO_URL"
+ else
+ REPO_URL="$DEFAULT_REPO_URL"
+ fi
+
+ # 检查是否使用本地文件安装
+ if [ "$INSTALL_MODE" = "local" ]; then
+ # 本地安装模式 - 复制当前目录的文件
+ SCRIPT_SOURCE="${BASH_SOURCE[0]}"
+ SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_SOURCE")" && pwd)"
+
+ echo -e "${BLUE} 使用本地文件安装...${NC}"
+
+ # 检查必要的文件是否存在
+ if [ ! -f "${SCRIPT_DIR}/frontend.py" ] || [ ! -f "${SCRIPT_DIR}/backend.py" ]; then
+ echo -e "${RED} ✗ 未找到 frontend.py 或 backend.py${NC}"
+ echo -e "${YELLOW} 请确保在 BootRepairTool 项目目录中运行此脚本${NC}"
+ exit 1
+ fi
+
+ # 如果目录存在,备份
+ if [ -d "${INSTALL_DIR}" ]; then
+ mv "${INSTALL_DIR}" "${INSTALL_DIR}.backup.$(date +%Y%m%d%H%M%S)"
+ fi
+
+ # 创建安装目录
+ mkdir -p "${INSTALL_DIR}"
+
+ # 复制所有 Python 文件和必要的资源
+ cp -r "${SCRIPT_DIR}"/*.py "${INSTALL_DIR}/" 2>/dev/null || true
+ cp -r "${SCRIPT_DIR}"/*.md "${INSTALL_DIR}/" 2>/dev/null || true
+ cp -r "${SCRIPT_DIR}/tip" "${INSTALL_DIR}/" 2>/dev/null || true
+
+ echo -e "${GREEN} ✓ 项目文件已复制到 ${INSTALL_DIR}${NC}"
+
+ elif [ -d "${INSTALL_DIR}/.git" ]; then
+ # Git 更新模式
+ echo -e "${BLUE} 项目已存在,正在更新...${NC}"
+ cd "${INSTALL_DIR}" || exit 1
+ git pull origin main || git pull origin master
+ if [ $? -eq 0 ]; then
+ echo -e "${GREEN} ✓ 项目更新成功${NC}"
+ else
+ echo -e "${YELLOW} 警告:更新失败,使用现有版本${NC}"
+ fi
+ else
+ # Git 克隆模式(默认)
+ echo -e "${BLUE} 正在从 ${REPO_URL} 克隆项目...${NC}"
+
+ # 如果目录存在但不是 git 仓库,先备份
+ if [ -d "${INSTALL_DIR}" ]; then
+ mv "${INSTALL_DIR}" "${INSTALL_DIR}.backup.$(date +%Y%m%d%H%M%S)"
+ fi
+
+ # 克隆仓库
+ git clone --depth 1 "${REPO_URL}" "${INSTALL_DIR}"
+ if [ $? -eq 0 ]; then
+ echo -e "${GREEN} ✓ 项目克隆成功${NC}"
+ else
+ echo -e "${RED} ✗ 项目克隆失败${NC}"
+ echo -e "${YELLOW} 提示:请检查网络连接或仓库地址是否正确${NC}"
+ echo -e "${YELLOW} 当前仓库地址: ${REPO_URL}${NC}"
+ echo -e "${YELLOW} 或使用本地安装: sudo bash arch-install.sh local${NC}"
+ exit 1
+ fi
+ fi
+}
+
+# 创建启动脚本
+create_launcher() {
+ echo -e "${YELLOW}[3/6] 创建启动脚本...${NC}"
+
+ # 创建主启动脚本
+ cat > "${INSTALL_DIR}/${EXEC_FILE}" << 'EOF'
+#!/bin/bash
+# ==============================================================================
+# BootRepairTool 启动脚本
+# 解决 Arch Linux 等系统上的 X11 字体渲染问题
+# ==============================================================================
+
+# 设置字体渲染环境变量,解决 "BadLength (poly request too large)" 错误
+export XLIB_SKIP_ARGB_VISUALS=1
+export GDK_NATIVE_WINDOWS=1
+export TCL_DONT_USE_RENDER_EXTENSION=1
+
+# 如果使用 Wayland,强制使用 XWayland
+if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
+ export GDK_BACKEND=x11
+fi
+
+# 获取脚本所在目录
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+
+# 切换到项目目录
+cd "${SCRIPT_DIR}" || exit 1
+
+# 使用系统 Python 运行前端
+exec python frontend.py "$@"
+EOF
+
+ chmod +x "${INSTALL_DIR}/${EXEC_FILE}"
+
+ # 创建软链接到 /bin
+ if [ -L "/bin/${EXEC_FILE}" ]; then
+ rm -f "/bin/${EXEC_FILE}"
+ fi
+ ln -sf "${INSTALL_DIR}/${EXEC_FILE}" "/bin/${EXEC_FILE}"
+
+ echo -e "${GREEN} ✓ 启动脚本创建完成${NC}"
+}
+
+# 创建图标
+create_icon() {
+ echo -e "${YELLOW}[4/6] 创建图标...${NC}"
+
+ # 创建简单的 SVG 图标
+ cat > "${INSTALL_DIR}/${ICON_FILE}" << 'EOF'
+
+
+EOF
+
+ echo -e "${GREEN} ✓ 图标创建完成${NC}"
+}
+
+# 创建桌面入口文件
+create_desktop_entry() {
+ echo -e "${YELLOW}[5/6] 创建桌面入口...${NC}"
+
+ cat > "${DESKTOP_INSTALL_DIR}/${DESKTOP_FILE_NAME}" << EOF
+[Desktop Entry]
+Version=1.0
+Type=Application
+Name=Linux GRUB 引导修复工具
+Name[zh_CN]=Linux GRUB 引导修复工具
+Name[en_US]=Boot Repair Tool
+Comment=修复 Linux 系统 GRUB 引导加载器
+Comment[zh_CN]=修复 Linux 系统 GRUB 引导加载器
+Categories=System;Settings;Utility;
+Terminal=false
+Icon=${INSTALL_DIR}/${ICON_FILE}
+Exec=pkexec ${INSTALL_DIR}/${EXEC_FILE}
+Actions=;
+EOF
+
+ chmod 644 "${DESKTOP_INSTALL_DIR}/${DESKTOP_FILE_NAME}"
+
+ # 创建 PolicyKit 规则
+ cat > "$POLICY_FILE" << EOF
+
+
+
+
+ Run Linux GRUB Boot Repair Tool
+ 运行 Linux GRUB 引导修复工具
+ Authentication is required to run the Boot Repair Tool.
+ 运行引导修复工具需要管理员权限
+ boot-repair
+
+ no
+ no
+ auth_admin
+
+ /bin/${EXEC_FILE}
+ true
+
+
+EOF
+
+ chmod 644 "$POLICY_FILE"
+
+ # 更新桌面数据库
+ if command -v update-desktop-database &>/dev/null; then
+ update-desktop-database "${DESKTOP_INSTALL_DIR}" 2>/dev/null || true
+ fi
+
+ echo -e "${GREEN} ✓ 桌面入口创建完成${NC}"
+}
+
+# 复制到用户桌面
+copy_to_user_desktop() {
+ echo -e "${YELLOW}[6/6] 创建用户桌面快捷方式...${NC}"
+
+ CURRENT_USER=$(logname 2>/dev/null || echo "${SUDO_USER}")
+ if [ -z "$CURRENT_USER" ]; then
+ CURRENT_USER=$(whoami)
+ fi
+
+ USER_DESKTOP_DIR=""
+ if [ -d "/home/${CURRENT_USER}/桌面" ]; then
+ USER_DESKTOP_DIR="/home/${CURRENT_USER}/桌面"
+ elif [ -d "/home/${CURRENT_USER}/Desktop" ]; then
+ USER_DESKTOP_DIR="/home/${CURRENT_USER}/Desktop"
+ fi
+
+ if [ -n "${USER_DESKTOP_DIR}" ] && [ -d "/home/${CURRENT_USER}" ]; then
+ cp -f "${DESKTOP_INSTALL_DIR}/${DESKTOP_FILE_NAME}" "${USER_DESKTOP_DIR}/"
+ chmod 755 "${USER_DESKTOP_DIR}/${DESKTOP_FILE_NAME}"
+ chown "${CURRENT_USER}:" "${USER_DESKTOP_DIR}/${DESKTOP_FILE_NAME}" 2>/dev/null || true
+ echo -e "${GREEN} ✓ 已复制到 ${USER_DESKTOP_DIR}${NC}"
+ else
+ echo -e "${YELLOW} 未找到用户桌面目录,跳过${NC}"
+ fi
+}
+
+# 显示完成信息
+show_completion() {
+ echo ""
+ echo -e "${CYAN}=================================================${NC}"
+ echo -e "${GREEN} 安装完成!${NC}"
+ echo -e "${CYAN}=================================================${NC}"
+ echo ""
+ echo -e "${YELLOW}📋 使用方式:${NC}"
+ echo ""
+ echo -e " ${GREEN}方法一:图形界面${NC}"
+ echo -e " 从应用程序菜单启动 '${APP_NAME}'"
+ echo ""
+ echo -e " ${GREEN}方法二:命令行 (推荐)${NC}"
+ echo -e " ${CYAN}sudo boot-repair${NC}"
+ echo ""
+ echo -e " ${GREEN}方法三:使用 pkexec${NC}"
+ echo -e " ${CYAN}pkexec boot-repair${NC}"
+ echo ""
+ echo -e "${YELLOW}📁 安装路径:${NC}"
+ echo -e " 源码目录: ${INSTALL_DIR}"
+ echo -e " 启动脚本: /bin/${EXEC_FILE}"
+ echo -e " 图标: ${INSTALL_DIR}/${ICON_FILE}"
+ echo ""
+ echo -e "${YELLOW}🔧 更新项目:${NC}"
+ echo -e " ${CYAN}cd ${INSTALL_DIR} && sudo git pull${NC}"
+ echo ""
+ echo -e "${YELLOW}🗑️ 卸载:${NC}"
+ echo -e " ${CYAN}sudo rm -rf ${INSTALL_DIR} /bin/${EXEC_FILE}${NC}"
+ echo -e " ${CYAN}sudo rm -f ${DESKTOP_INSTALL_DIR}/${DESKTOP_FILE_NAME}${NC}"
+ echo -e " ${CYAN}sudo rm -f ${POLICY_FILE}${NC}"
+ echo ""
+ echo -e "${CYAN}=================================================${NC}"
+ echo -e "${GREEN}提示: 如果未在菜单中看到程序,请尝试注销并重新登录。${NC}"
+ echo -e "${CYAN}=================================================${NC}"
+ echo ""
+
+ # 询问是否立即运行
+ read -p "是否立即运行程序? [y/N]: " -n 1 -r
+ echo
+ if [[ $REPLY =~ ^[Yy]$ ]]; then
+ echo -e "${GREEN}正在启动 ${APP_NAME}...${NC}"
+ "${INSTALL_DIR}/${EXEC_FILE}"
+ fi
+}
+
+# 显示帮助信息
+show_help() {
+ echo -e "${CYAN}=================================================${NC}"
+ echo -e "${APP_NAME} - Arch Linux 安装脚本"
+ echo -e "${CYAN}=================================================${NC}"
+ echo ""
+ echo -e "用法: sudo bash $0 [模式] [仓库地址]"
+ echo ""
+ echo -e "参数:"
+ echo -e " 模式: git (默认) 或 local"
+ echo -e " 仓库地址: 自定义 Git 仓库 URL(可选)"
+ echo ""
+ echo -e "示例:"
+ echo -e " ${GREEN}sudo bash $0${NC} # 默认从 Git 克隆"
+ echo -e " ${GREEN}sudo bash $0 git${NC} # 从默认仓库克隆"
+ echo -e " ${GREEN}sudo bash $0 git https://...${NC} # 从指定仓库克隆"
+ echo -e " ${GREEN}sudo bash $0 local${NC} # 从当前目录复制"
+ echo ""
+}
+}
+
+# 主函数
+main() {
+ # 显示帮助
+ if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
+ show_help
+ exit 0
+ fi
+
+ echo -e "${CYAN}=================================================${NC}"
+ echo -e "${CYAN} ${APP_NAME} - Arch Linux 安装脚本${NC}"
+ echo -e "${CYAN}=================================================${NC}"
+ echo ""
+
+ check_root
+ install_dependencies
+ clone_or_update_project
+ create_launcher
+ create_icon
+ create_desktop_entry
+ copy_to_user_desktop
+ show_completion
+}
+
+# 运行主函数
+main "$@"
diff --git a/build.py b/build.py
index 6c74985..5f5b4c7 100755
--- a/build.py
+++ b/build.py
@@ -29,7 +29,7 @@ def check_python_version():
def install_dependencies():
"""安装打包所需的依赖"""
- print("\n[1/4] 安装依赖...")
+ print("\n[1/5] 安装依赖...")
deps = ["pyinstaller"]
@@ -47,7 +47,7 @@ def install_dependencies():
def clean_build():
"""清理之前的构建文件"""
- print("\n[2/4] 清理构建文件...")
+ print("\n[2/5] 清理构建文件...")
dirs_to_remove = ["build", "dist"]
files_to_remove = ["*.pyc", "*.spec"]
@@ -69,12 +69,12 @@ def clean_build():
def build_executable():
"""使用 PyInstaller 打包"""
- print("\n[3/4] 开始打包...")
+ print("\n[3/5] 开始打包...")
- # 打包命令
+ # 打包命令 - 输出为 .bin 文件,wrapper 脚本将调用它
cmd = [
sys.executable, "-m", "PyInstaller",
- "--name=LinuxGrubRepair",
+ "--name=LinuxGrubRepair.bin",
"--onefile",
"--console",
"--clean",
@@ -93,23 +93,81 @@ def build_executable():
return False
-def show_result():
- """显示打包结果"""
- print("\n[4/4] 打包完成!")
+def create_launcher():
+ """创建启动器脚本,解决 X11 字体渲染问题"""
+ print("\n[4/5] 创建启动器脚本...")
+
+ launcher_content = '''#!/bin/bash
+# ==============================================================================
+# BootRepairTool 启动脚本
+# 解决 Arch Linux 等系统上的 X11 字体渲染问题
+# ==============================================================================
+
+# 获取脚本实际所在目录(处理软链接情况)
+SCRIPT_SOURCE="${BASH_SOURCE[0]}"
+while [ -L "$SCRIPT_SOURCE" ]; do
+ SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_SOURCE")" && pwd)"
+ SCRIPT_SOURCE="$(readlink "$SCRIPT_SOURCE")"
+ [[ $SCRIPT_SOURCE != /* ]] && SCRIPT_SOURCE="$SCRIPT_DIR/$SCRIPT_SOURCE"
+done
+SCRIPT_DIR="$(cd "$(dirname "$SCRIPT_SOURCE")" && pwd)"
+
+# 如果是从 /bin 软链接启动,则使用实际安装目录
+if [ "$SCRIPT_DIR" = "/bin" ] || [ "$SCRIPT_DIR" = "/usr/bin" ]; then
+ SCRIPT_DIR="/opt/boot-repair-tool"
+fi
+
+# 设置字体渲染环境变量,解决 "BadLength (poly request too large)" 错误
+export XLIB_SKIP_ARGB_VISUALS=1
+
+# 禁用某些 X11 RENDER 扩展功能
+export GDK_NATIVE_WINDOWS=1
+
+# 设置 tkinter 使用基本字体渲染
+export TCL_DONT_USE_RENDER_EXTENSION=1
+
+# 如果使用 Wayland,强制使用 XWayland
+if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
+ export GDK_BACKEND=x11
+fi
+
+# 执行实际程序
+exec "${SCRIPT_DIR}/LinuxGrubRepair.bin" "$@"
+'''
dist_path = os.path.join(os.getcwd(), "dist")
- exe_name = "LinuxGrubRepair"
- exe_path = os.path.join(dist_path, exe_name)
+ launcher_path = os.path.join(dist_path, "LinuxGrubRepair")
- if os.path.exists(exe_path):
- size = os.path.getsize(exe_path)
- size_mb = size / (1024 * 1024)
- print(f"\n 可执行文件: {exe_path}")
- print(f" 文件大小: {size_mb:.2f} MB")
+ with open(launcher_path, 'w') as f:
+ f.write(launcher_content)
+
+ # 设置可执行权限
+ os.chmod(launcher_path, 0o755)
+ print(f" ✓ 启动器创建完成: {launcher_path}")
+ return True
+
+
+def show_result():
+ """显示打包结果"""
+ print("\n[5/5] 打包完成!")
+
+ dist_path = os.path.join(os.getcwd(), "dist")
+ launcher_name = "LinuxGrubRepair"
+ bin_name = "LinuxGrubRepair.bin"
+ launcher_path = os.path.join(dist_path, launcher_name)
+ bin_path = os.path.join(dist_path, bin_name)
+
+ if os.path.exists(launcher_path) and os.path.exists(bin_path):
+ bin_size = os.path.getsize(bin_path)
+ bin_size_mb = bin_size / (1024 * 1024)
+ print(f"\n 启动器: {launcher_path}")
+ print(f" 程序文件: {bin_path}")
+ print(f" 文件大小: {bin_size_mb:.2f} MB")
print("\n 使用方式:")
- print(f" sudo ./{exe_name}")
+ print(f" sudo ./{launcher_name}")
+ print("\n 注意: 启动器脚本已配置 X11 环境变量,可解决字体渲染问题")
else:
- print(" 未找到生成的可执行文件")
+ print(" 未找到生成的文件")
def main():
@@ -135,6 +193,11 @@ def main():
print("打包失败")
sys.exit(1)
+ # 创建启动器
+ if not create_launcher():
+ print("创建启动器失败")
+ sys.exit(1)
+
# 显示结果
show_result()
diff --git a/dist/LinuxGrubRepair b/dist/LinuxGrubRepair
index 73cd65c..1a5a28e 100755
Binary files a/dist/LinuxGrubRepair and b/dist/LinuxGrubRepair differ
diff --git a/dist/LinuxGrubRepair.bin b/dist/LinuxGrubRepair.bin
new file mode 100755
index 0000000..cbedd47
Binary files /dev/null and b/dist/LinuxGrubRepair.bin differ
diff --git a/frontend.py b/frontend.py
index d5c7480..676895a 100644
--- a/frontend.py
+++ b/frontend.py
@@ -8,10 +8,45 @@ import os
import re
import backend
+# ==============================================================================
+# X11 字体渲染问题修复
+# 设置 tkinter 使用安全字体,避免 "BadLength" 错误
+# ==============================================================================
+def setup_safe_fonts():
+ """配置安全的字体设置,解决 Arch Linux 等系统上的 X11 渲染问题"""
+ try:
+ # 设置 tkinter 使用安全字体
+ # 避免使用可能导致 X11 RENDER 扩展问题的复杂字体
+ default_fonts = {
+ 'TkDefaultFont': ('DejaVu Sans', 10),
+ 'TkTextFont': ('DejaVu Sans', 10),
+ 'TkFixedFont': ('DejaVu Sans Mono', 10),
+ 'TkMenuFont': ('DejaVu Sans', 10),
+ 'TkHeadingFont': ('DejaVu Sans', 12, 'bold'),
+ }
+
+ for font_name, font_config in default_fonts.items():
+ try:
+ tk.font.nametofont(font_name).configure(family=font_config[0], size=font_config[1])
+ except:
+ pass
+ except:
+ pass
+
+# 尝试导入字体模块
+try:
+ import tkinter.font as tkfont
+except ImportError:
+ import tkFont as tkfont
+
class GrubRepairApp:
def __init__(self, master):
self.master = master
+
+ # 设置安全字体
+ setup_safe_fonts()
+
master.title("Linux GRUB 引导修复工具 v2.0")
master.geometry("643x750")
master.resizable(True, True)
diff --git a/install.sh b/install.sh
index 29e4092..5275b33 100755
--- a/install.sh
+++ b/install.sh
@@ -19,6 +19,7 @@
APP_NAME="Linux GRUB 引导修复工具"
APP_NAME_EN="BootRepairTool"
EXEC_FILE="LinuxGrubRepair"
+EXEC_BIN_FILE="LinuxGrubRepair.bin"
ICON_FILE="boot-repair.png"
INSTALL_DIR="/opt/boot-repair-tool"
DESKTOP_FILE_NAME="boot-repair.desktop"
@@ -118,20 +119,25 @@ mkdir -p "${INSTALL_DIR}" || { echo -e "${RED}创建目录失败!${NC}"; exit
echo -e "${GREEN} 目录创建完成。${NC}"
echo -e "${GREEN}2. 安装可执行文件...${NC}"
-# 首先尝试使用本地文件
-if use_local_file "./dist/${EXEC_FILE}" "${INSTALL_DIR}/${EXEC_FILE}" "可执行文件"; then
+# 首先尝试使用本地文件(包括启动器和 .bin 文件)
+if [ -f "./dist/${EXEC_FILE}" ] && [ -f "./dist/${EXEC_BIN_FILE}" ]; then
+ use_local_file "./dist/${EXEC_FILE}" "${INSTALL_DIR}/${EXEC_FILE}" "启动器脚本"
+ use_local_file "./dist/${EXEC_BIN_FILE}" "${INSTALL_DIR}/${EXEC_BIN_FILE}" "程序文件"
echo -e "${GREEN} 本地可执行文件已复制。${NC}"
-# 然后尝试从 URL 下载
+# 然后尝试从 URL 下载(单文件模式,用于在线安装)
elif [ "${BASE_DOWNLOAD_URL}" != "https://your-domain.com/data/sh/boot-repair" ]; then
download_file "${EXEC_DOWNLOAD_URL}" "${INSTALL_DIR}/${EXEC_FILE}" "${EXEC_FILE}"
else
echo -e "${RED}错误:未找到可执行文件!${NC}"
- echo -e "${YELLOW}请先将可执行文件放入 ./dist/${EXEC_FILE} 目录,${NC}"
- echo -e "${YELLOW}或修改 BASE_DOWNLOAD_URL 配置。${NC}"
+ echo -e "${YELLOW}请先将可执行文件放入 ./dist/ 目录:${NC}"
+ echo -e "${YELLOW} - ${EXEC_FILE} (启动器脚本)${NC}"
+ echo -e "${YELLOW} - ${EXEC_BIN_FILE} (程序文件)${NC}"
+ echo -e "${YELLOW}或修改 BASE_DOWNLOAD_URL 配置用于在线安装。${NC}"
exit 1
fi
chmod +x "${INSTALL_DIR}/${EXEC_FILE}"
+[ -f "${INSTALL_DIR}/${EXEC_BIN_FILE}" ] && chmod +x "${INSTALL_DIR}/${EXEC_BIN_FILE}"
echo -e "${GREEN} 可执行文件权限设置完成。${NC}"
echo -e "${GREEN}3. 安装图标...${NC}"
@@ -185,7 +191,7 @@ cat << EOF > "$POLICY_FILE"
no
auth_admin
- ${INSTALL_DIR}/${EXEC_FILE}
+ /bin/boot-repair
true
diff --git a/uninstall.sh b/uninstall.sh
index 9c4b771..1ba0103 100755
--- a/uninstall.sh
+++ b/uninstall.sh
@@ -10,6 +10,7 @@
# --- 配置变量 ---
APP_NAME="Linux GRUB 引导修复工具"
EXEC_FILE="LinuxGrubRepair"
+EXEC_BIN_FILE="LinuxGrubRepair.bin"
ICON_FILE="boot-repair.png"
INSTALL_DIR="/opt/boot-repair-tool"
DESKTOP_FILE_NAME="boot-repair.desktop"