181404010226 2 mēneši atpakaļ
vecāks
revīzija
f5f63258f2

+ 359 - 0
assets/data/excel/build_installer.py

@@ -0,0 +1,359 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+依赖安装器构建脚本
+Build script for dependency installer
+
+功能:
+1. 使用PyInstaller将install_dependencies.py打包成exe
+2. 创建便携式安装包
+3. 生成安装说明文档
+
+作者: AI Assistant
+日期: 2024
+"""
+
+import os
+import sys
+import subprocess
+import shutil
+from pathlib import Path
+import json
+
+class InstallerBuilder:
+    def __init__(self):
+        self.script_dir = Path(__file__).parent
+        self.build_dir = self.script_dir / "build"
+        self.dist_dir = self.script_dir / "dist"
+        self.installer_dir = self.script_dir / "installer_package"
+        
+    def check_pyinstaller(self):
+        """检查PyInstaller是否可用"""
+        try:
+            import PyInstaller
+            print("✓ PyInstaller 已安装")
+            return True
+        except ImportError:
+            print("✗ PyInstaller 未安装,正在安装...")
+            try:
+                subprocess.run([sys.executable, '-m', 'pip', 'install', 'pyinstaller'], 
+                             check=True)
+                print("✓ PyInstaller 安装成功")
+                return True
+            except subprocess.CalledProcessError:
+                print("✗ PyInstaller 安装失败")
+                return False
+                
+    def create_spec_file(self):
+        """创建PyInstaller规格文件"""
+        spec_content = '''# -*- mode: python ; coding: utf-8 -*-
+
+block_cipher = None
+
+a = Analysis(
+    ['install_dependencies.py'],
+    pathex=[],
+    binaries=[],
+    datas=[
+        ('requirements.txt', '.'),
+    ],
+    hiddenimports=[
+        'pkg_resources.py2_warn',
+        'packaging',
+        'packaging.version',
+        'packaging.specifiers',
+        'packaging.requirements',
+    ],
+    hookspath=[],
+    hooksconfig={},
+    runtime_hooks=[],
+    excludes=[],
+    win_no_prefer_redirects=False,
+    win_private_assemblies=False,
+    cipher=block_cipher,
+    noarchive=False,
+)
+
+pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
+
+exe = EXE(
+    pyz,
+    a.scripts,
+    a.binaries,
+    a.zipfiles,
+    a.datas,
+    [],
+    name='游戏配置工具依赖安装器',
+    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,
+    icon=None,
+)
+'''
+        
+        spec_file = self.script_dir / "installer.spec"
+        with open(spec_file, 'w', encoding='utf-8') as f:
+            f.write(spec_content)
+            
+        print(f"✓ 规格文件已创建: {spec_file}")
+        return spec_file
+        
+    def build_executable(self):
+        """构建可执行文件"""
+        spec_file = self.create_spec_file()
+        
+        try:
+            print("开始构建可执行文件...")
+            cmd = [
+                sys.executable, '-m', 'PyInstaller',
+                '--clean',
+                '--noconfirm',
+                str(spec_file)
+            ]
+            
+            result = subprocess.run(cmd, cwd=self.script_dir, capture_output=True, text=True)
+            
+            if result.returncode == 0:
+                print("✓ 可执行文件构建成功")
+                return True
+            else:
+                print(f"✗ 构建失败: {result.stderr}")
+                return False
+                
+        except Exception as e:
+            print(f"✗ 构建过程中发生错误: {str(e)}")
+            return False
+            
+    def create_installer_package(self):
+        """创建安装包目录"""
+        # 清理并创建安装包目录
+        if self.installer_dir.exists():
+            shutil.rmtree(self.installer_dir)
+        self.installer_dir.mkdir()
+        
+        # 复制可执行文件
+        exe_source = self.dist_dir / "游戏配置工具依赖安装器.exe"
+        exe_dest = self.installer_dir / "游戏配置工具依赖安装器.exe"
+        
+        if exe_source.exists():
+            shutil.copy2(exe_source, exe_dest)
+            print(f"✓ 可执行文件已复制到: {exe_dest}")
+        else:
+            print(f"✗ 找不到可执行文件: {exe_source}")
+            return False
+            
+        # 复制相关文件
+        files_to_copy = [
+            'requirements.txt',
+            '启动配置工具.bat'
+        ]
+        
+        for file_name in files_to_copy:
+            source = self.script_dir / file_name
+            if source.exists():
+                dest = self.installer_dir / file_name
+                shutil.copy2(source, dest)
+                print(f"✓ 已复制: {file_name}")
+                
+        return True
+        
+    def create_readme(self):
+        """创建使用说明文档"""
+        readme_content = '''# 游戏配置工具依赖安装器
+
+## 简介
+这是一个自动安装游戏配置管理工具所需Python依赖库的工具。
+
+## 使用方法
+
+### 方法一:使用可执行文件(推荐)
+1. 双击运行 `游戏配置工具依赖安装器.exe`
+2. 等待安装完成
+3. 运行 `启动配置工具.bat` 使用配置管理工具
+
+### 方法二:使用Python脚本
+如果可执行文件无法运行,可以直接使用Python脚本:
+1. 确保已安装Python 3.7或更高版本
+2. 运行命令:`python install_dependencies.py`
+
+## 安装的依赖库
+- **pandas**: Excel和CSV文件处理
+- **openpyxl**: Excel文件读写支持
+- **pyinstaller**: 用于打包Python脚本(可选)
+- **xlsxwriter**: 额外的Excel支持(可选)
+- **xlrd**: 旧版Excel文件支持(可选)
+
+## 系统要求
+- Windows 7/8/10/11
+- Python 3.7+ (如果使用Python脚本)
+- 网络连接(用于下载依赖库)
+
+## 故障排除
+
+### 问题1:可执行文件无法运行
+- 确保Windows Defender或杀毒软件没有阻止程序运行
+- 尝试以管理员身份运行
+- 使用Python脚本方式安装
+
+### 问题2:网络连接问题
+- 检查网络连接
+- 如果在公司网络环境,可能需要配置代理
+- 可以尝试使用手机热点
+
+### 问题3:权限问题
+- 以管理员身份运行安装器
+- 确保对Python安装目录有写入权限
+
+### 问题4:Python版本问题
+- 确保使用Python 3.7或更高版本
+- 可以从 https://python.org 下载最新版本
+
+## 验证安装
+安装完成后,会生成 `install_report.json` 文件,包含详细的安装信息。
+
+## 联系支持
+如果遇到问题,请检查:
+1. `install_report.json` 文件中的错误信息
+2. 确保网络连接正常
+3. 确保Python环境正确配置
+
+---
+生成时间: {timestamp}
+版本: 1.0.0
+'''
+        
+        from datetime import datetime
+        readme_content = readme_content.format(
+            timestamp=datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+        )
+        
+        readme_file = self.installer_dir / "README.md"
+        with open(readme_file, 'w', encoding='utf-8') as f:
+            f.write(readme_content)
+            
+        print(f"✓ 使用说明已创建: {readme_file}")
+        
+    def create_batch_installer(self):
+        """创建批处理安装脚本"""
+        batch_content = '''@echo off
+chcp 65001 >nul
+echo ========================================
+echo 游戏配置工具依赖自动安装器
+echo ========================================
+echo.
+
+echo 正在检查Python环境...
+python --version >nul 2>&1
+if errorlevel 1 (
+    echo 错误: 未找到Python环境
+    echo 请先安装Python 3.7或更高版本
+    echo 下载地址: https://python.org
+    echo.
+    pause
+    exit /b 1
+)
+
+echo Python环境检查通过
+echo.
+
+echo 开始安装依赖库...
+"游戏配置工具依赖安装器.exe"
+
+echo.
+echo 安装完成!
+echo 现在可以运行 "启动配置工具.bat" 来使用配置管理工具
+echo.
+pause
+'''
+        
+        batch_file = self.installer_dir / "一键安装依赖.bat"
+        with open(batch_file, 'w', encoding='gbk') as f:
+            f.write(batch_content)
+            
+        print(f"✓ 批处理安装脚本已创建: {batch_file}")
+        
+    def cleanup_build_files(self):
+        """清理构建文件"""
+        try:
+            if self.build_dir.exists():
+                shutil.rmtree(self.build_dir)
+                print("✓ 构建临时文件已清理")
+                
+            # 保留dist目录,但可以选择清理
+            # if self.dist_dir.exists():
+            #     shutil.rmtree(self.dist_dir)
+            
+            spec_file = self.script_dir / "installer.spec"
+            if spec_file.exists():
+                spec_file.unlink()
+                print("✓ 规格文件已清理")
+                
+        except Exception as e:
+            print(f"清理文件时发生错误: {str(e)}")
+            
+    def build_complete_installer(self):
+        """构建完整的安装包"""
+        print("=" * 60)
+        print("游戏配置工具依赖安装器构建脚本")
+        print("=" * 60)
+        
+        # 检查PyInstaller
+        if not self.check_pyinstaller():
+            return False
+            
+        # 构建可执行文件
+        if not self.build_executable():
+            return False
+            
+        # 创建安装包
+        if not self.create_installer_package():
+            return False
+            
+        # 创建文档
+        self.create_readme()
+        self.create_batch_installer()
+        
+        # 清理构建文件
+        self.cleanup_build_files()
+        
+        print("\n" + "=" * 60)
+        print("构建完成!")
+        print(f"安装包位置: {self.installer_dir}")
+        print("=" * 60)
+        print("\n安装包内容:")
+        for item in self.installer_dir.iterdir():
+            print(f"  - {item.name}")
+            
+        return True
+
+def main():
+    """主函数"""
+    builder = InstallerBuilder()
+    
+    try:
+        success = builder.build_complete_installer()
+        
+        if success:
+            print("\n构建成功!")
+            print("现在可以将 'installer_package' 目录复制到其他电脑使用。")
+        else:
+            print("\n构建失败,请检查错误信息。")
+            
+    except KeyboardInterrupt:
+        print("\n构建被用户中断")
+    except Exception as e:
+        print(f"\n构建过程中发生未预期的错误: {str(e)}")
+        
+    input("\n按回车键退出...")
+
+if __name__ == "__main__":
+    main()

+ 279 - 0
assets/data/excel/install_dependencies.py

@@ -0,0 +1,279 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+游戏配置工具依赖自动安装器
+Game Configuration Tool Dependencies Auto Installer
+
+功能:
+1. 自动检测Python环境
+2. 检查并安装所需依赖库
+3. 创建虚拟环境(可选)
+4. 验证安装结果
+
+作者: AI Assistant
+日期: 2024
+"""
+
+import sys
+import subprocess
+import os
+import importlib
+import json
+from pathlib import Path
+
+class DependencyInstaller:
+    def __init__(self):
+        self.required_packages = {
+            'pandas': '>=1.3.0',
+            'openpyxl': '>=3.0.0',
+            'pyinstaller': '>=4.0'
+        }
+        
+        self.optional_packages = {
+            'xlsxwriter': '>=1.0.0',  # 额外的Excel支持
+            'xlrd': '>=2.0.0'         # 旧版Excel文件支持
+        }
+        
+        self.install_log = []
+        
+    def log_message(self, message, level="INFO"):
+        """记录安装日志"""
+        log_entry = f"[{level}] {message}"
+        self.install_log.append(log_entry)
+        print(log_entry)
+        
+    def check_python_version(self):
+        """检查Python版本"""
+        version = sys.version_info
+        self.log_message(f"Python版本: {version.major}.{version.minor}.{version.micro}")
+        
+        if version.major < 3 or (version.major == 3 and version.minor < 7):
+            self.log_message("警告: 建议使用Python 3.7或更高版本", "WARNING")
+            return False
+        return True
+        
+    def check_pip_available(self):
+        """检查pip是否可用"""
+        try:
+            import pip
+            self.log_message("pip可用")
+            return True
+        except ImportError:
+            try:
+                subprocess.run([sys.executable, '-m', 'pip', '--version'], 
+                             check=True, capture_output=True)
+                self.log_message("pip模块可用")
+                return True
+            except subprocess.CalledProcessError:
+                self.log_message("pip不可用,请先安装pip", "ERROR")
+                return False
+                
+    def is_package_installed(self, package_name):
+        """检查包是否已安装"""
+        try:
+            importlib.import_module(package_name)
+            return True
+        except ImportError:
+            return False
+            
+    def get_package_version(self, package_name):
+        """获取已安装包的版本"""
+        try:
+            module = importlib.import_module(package_name)
+            if hasattr(module, '__version__'):
+                return module.__version__
+            else:
+                # 尝试通过pip show获取版本
+                result = subprocess.run([sys.executable, '-m', 'pip', 'show', package_name],
+                                      capture_output=True, text=True)
+                if result.returncode == 0:
+                    for line in result.stdout.split('\n'):
+                        if line.startswith('Version:'):
+                            return line.split(':')[1].strip()
+                return "未知版本"
+        except:
+            return None
+            
+    def install_package(self, package_name, version_spec=""):
+        """安装单个包"""
+        package_spec = f"{package_name}{version_spec}" if version_spec else package_name
+        
+        try:
+            self.log_message(f"正在安装 {package_spec}...")
+            
+            # 使用pip安装
+            cmd = [sys.executable, '-m', 'pip', 'install', package_spec, '--upgrade']
+            
+            result = subprocess.run(cmd, capture_output=True, text=True, timeout=300)
+            
+            if result.returncode == 0:
+                self.log_message(f"✓ {package_name} 安装成功")
+                return True
+            else:
+                self.log_message(f"✗ {package_name} 安装失败: {result.stderr}", "ERROR")
+                return False
+                
+        except subprocess.TimeoutExpired:
+            self.log_message(f"✗ {package_name} 安装超时", "ERROR")
+            return False
+        except Exception as e:
+            self.log_message(f"✗ {package_name} 安装异常: {str(e)}", "ERROR")
+            return False
+            
+    def check_and_install_dependencies(self):
+        """检查并安装所有依赖"""
+        self.log_message("开始检查依赖...")
+        
+        success_count = 0
+        total_count = len(self.required_packages)
+        
+        for package, version_spec in self.required_packages.items():
+            if self.is_package_installed(package):
+                current_version = self.get_package_version(package)
+                self.log_message(f"✓ {package} 已安装 (版本: {current_version})")
+                success_count += 1
+            else:
+                self.log_message(f"✗ {package} 未安装,开始安装...")
+                if self.install_package(package, version_spec):
+                    success_count += 1
+                    
+        # 安装可选包
+        self.log_message("\n检查可选依赖...")
+        for package, version_spec in self.optional_packages.items():
+            if not self.is_package_installed(package):
+                self.log_message(f"安装可选包: {package}")
+                self.install_package(package, version_spec)
+                
+        return success_count == total_count
+        
+    def verify_installation(self):
+        """验证安装结果"""
+        self.log_message("\n验证安装结果...")
+        
+        verification_results = {}
+        
+        for package in self.required_packages.keys():
+            try:
+                module = importlib.import_module(package)
+                version = self.get_package_version(package)
+                verification_results[package] = {
+                    'installed': True,
+                    'version': version,
+                    'import_success': True
+                }
+                self.log_message(f"✓ {package} 验证成功 (版本: {version})")
+            except Exception as e:
+                verification_results[package] = {
+                    'installed': False,
+                    'version': None,
+                    'import_success': False,
+                    'error': str(e)
+                }
+                self.log_message(f"✗ {package} 验证失败: {str(e)}", "ERROR")
+                
+        return verification_results
+        
+    def test_functionality(self):
+        """测试核心功能"""
+        self.log_message("\n测试核心功能...")
+        
+        try:
+            # 测试pandas
+            import pandas as pd
+            df = pd.DataFrame({'test': [1, 2, 3]})
+            self.log_message("✓ pandas 基本功能测试通过")
+            
+            # 测试openpyxl
+            import openpyxl
+            wb = openpyxl.Workbook()
+            self.log_message("✓ openpyxl 基本功能测试通过")
+            
+            # 测试pyinstaller
+            import PyInstaller
+            self.log_message("✓ PyInstaller 导入测试通过")
+            
+            return True
+            
+        except Exception as e:
+            self.log_message(f"✗ 功能测试失败: {str(e)}", "ERROR")
+            return False
+            
+    def save_install_report(self):
+        """保存安装报告"""
+        report = {
+            'timestamp': str(Path(__file__).stat().st_mtime),
+            'python_version': f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}",
+            'install_log': self.install_log,
+            'verification_results': self.verify_installation()
+        }
+        
+        report_file = Path(__file__).parent / 'install_report.json'
+        try:
+            with open(report_file, 'w', encoding='utf-8') as f:
+                json.dump(report, f, ensure_ascii=False, indent=2)
+            self.log_message(f"安装报告已保存到: {report_file}")
+        except Exception as e:
+            self.log_message(f"保存安装报告失败: {str(e)}", "ERROR")
+            
+    def run_installation(self):
+        """运行完整安装流程"""
+        self.log_message("=" * 60)
+        self.log_message("游戏配置工具依赖自动安装器")
+        self.log_message("=" * 60)
+        
+        # 检查Python环境
+        if not self.check_python_version():
+            self.log_message("Python版本检查失败,但继续安装...", "WARNING")
+            
+        # 检查pip
+        if not self.check_pip_available():
+            self.log_message("pip不可用,无法继续安装", "ERROR")
+            return False
+            
+        # 安装依赖
+        if self.check_and_install_dependencies():
+            self.log_message("\n所有必需依赖安装完成!")
+        else:
+            self.log_message("\n部分依赖安装失败,请检查错误信息", "WARNING")
+            
+        # 验证安装
+        verification_results = self.verify_installation()
+        
+        # 测试功能
+        if self.test_functionality():
+            self.log_message("\n✓ 所有功能测试通过!")
+        else:
+            self.log_message("\n✗ 功能测试失败,请检查安装", "ERROR")
+            
+        # 保存报告
+        self.save_install_report()
+        
+        self.log_message("\n安装完成!现在可以运行配置工具了。")
+        return True
+
+def main():
+    """主函数"""
+    installer = DependencyInstaller()
+    
+    try:
+        success = installer.run_installation()
+        
+        if success:
+            print("\n" + "=" * 60)
+            print("安装成功!")
+            print("现在可以运行 '启动配置工具.bat' 来使用配置管理工具。")
+            print("=" * 60)
+        else:
+            print("\n" + "=" * 60)
+            print("安装过程中遇到问题,请查看上面的错误信息。")
+            print("=" * 60)
+            
+    except KeyboardInterrupt:
+        print("\n安装被用户中断")
+    except Exception as e:
+        print(f"\n安装过程中发生未预期的错误: {str(e)}")
+        
+    input("\n按回车键退出...")
+
+if __name__ == "__main__":
+    main()

+ 17 - 0
assets/data/excel/installer_package/requirements.txt

@@ -0,0 +1,17 @@
+# 游戏配置管理工具依赖库
+# Game Configuration Management Tool Dependencies
+
+# Excel文件读写支持
+pandas>=1.3.0
+openpyxl>=3.0.0
+
+# GUI界面支持 (Python内置,无需安装)
+# tkinter - Built-in with Python
+
+# 其他标准库 (Python内置,无需安装)
+# json - Built-in
+# os - Built-in
+# csv - Built-in
+# datetime - Built-in
+# pathlib - Built-in
+# threading - Built-in

+ 29 - 0
assets/data/excel/installer_package/一键安装依赖.bat

@@ -0,0 +1,29 @@
+@echo off
+chcp 65001 >nul
+echo ========================================
+echo ��Ϸ���ù��������Զ���װ��
+echo ========================================
+echo.
+
+echo ���ڼ��Python����...
+python --version >nul 2>&1
+if errorlevel 1 (
+    echo ����: δ�ҵ�Python����
+    echo ���Ȱ�װPython 3.7����߰汾
+    echo ���ص�ַ: https://python.org
+    echo.
+    pause
+    exit /b 1
+)
+
+echo Python�������ͨ��
+echo.
+
+echo ��ʼ��װ������...
+"��Ϸ���ù���������װ��.exe"
+
+echo.
+echo ��װ��ɣ�
+echo ���ڿ������� "�������ù���.bat" ��ʹ�����ù�������
+echo.
+pause

BIN
assets/data/excel/installer_package/游戏配置工具依赖安装器.exe