diff --git a/build_v1.0.py b/build_v1.0.py new file mode 100644 index 0000000..9689a80 --- /dev/null +++ b/build_v1.0.py @@ -0,0 +1,331 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +MagicWord 1.0.0 版本发布脚本 +用于构建和打包应用程序,包含所有图片和图标资源 +""" + +import os +import sys +import subprocess +import platform +import shutil +import zipfile +from datetime import datetime +from PIL import Image + +def run_command(command, shell=False, cwd=None): + """运行命令并返回结果""" + try: + result = subprocess.run(command, shell=shell, capture_output=True, text=True, encoding='utf-8', cwd=cwd) + return result.returncode, result.stdout, result.stderr + except Exception as e: + return -1, "", str(e) + +def create_ico_from_png(): + """从PNG图标创建ICO文件""" + print("创建ICO图标文件...") + + # 检查是否存在256x256的PNG图标 + png_path = "resources/icons/app_icon_256X256.png" + ico_path = "resources/icons/app_icon.ico" + + if os.path.exists(png_path): + try: + # 打开PNG图像 + img = Image.open(png_path) + + # 创建不同尺寸的图标 + icon_sizes = [(16, 16), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)] + + # 保存为ICO格式 + img.save(ico_path, format='ICO', sizes=icon_sizes) + print(f"ICO图标创建成功: {ico_path}") + return True + except Exception as e: + print(f"创建ICO图标失败: {e}") + return False + else: + print(f"找不到PNG图标文件: {png_path}") + return False + +def clean_build_dirs(): + """清理构建目录""" + print("清理构建目录...") + dirs_to_clean = ['build', 'dist', '__pycache__', '*.egg-info'] + + for dir_name in dirs_to_clean: + if '*' in dir_name: + # 处理通配符 + import glob + for path in glob.glob(dir_name): + if os.path.isdir(path): + shutil.rmtree(path, ignore_errors=True) + elif os.path.exists(dir_name): + if os.path.isdir(dir_name): + shutil.rmtree(dir_name, ignore_errors=True) + else: + os.remove(dir_name) + + # 清理src目录下的__pycache__ + for root, dirs, files in os.walk('src'): + for dir_name in dirs: + if dir_name == '__pycache__': + cache_path = os.path.join(root, dir_name) + shutil.rmtree(cache_path, ignore_errors=True) + print(f"清理缓存: {cache_path}") + +def install_dependencies(): + """安装依赖""" + print("安装项目依赖...") + + # 首先安装PIL(用于图标转换) + code, stdout, stderr = run_command([sys.executable, "-m", "pip", "install", "Pillow"]) + if code != 0: + print(f"Pillow安装失败: {stderr}") + return False + + # 安装其他依赖 + code, stdout, stderr = run_command([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"]) + if code != 0: + print(f"依赖安装失败: {stderr}") + return False + print("依赖安装成功") + return True + +def build_executable(): + """构建可执行文件""" + print("构建可执行文件...") + + # 安装pyinstaller + print("安装PyInstaller...") + code, stdout, stderr = run_command([sys.executable, "-m", "pip", "install", "pyinstaller"]) + if code != 0: + print(f"PyInstaller安装失败: {stderr}") + return False + + # 创建ICO图标 + create_ico_from_png() + + # PyInstaller命令 - 完整版本 + pyinstaller_cmd = [ + "pyinstaller", + "--name", "MagicWord", + "--version", "1.0.0", # 设置版本号为1.0.0 + "--distpath", "dist", + "--workpath", "build", + "--specpath", ".", + # 添加资源文件 + "--add-data", "resources;resources", + "--add-data", "resources/icons;resources/icons", + "--add-data", "resources/config;resources/config", + "--add-data", "resources/qss;resources/qss", + "--add-data", "src;src", + "--add-data", "src/ui;src/ui", + "--add-data", "src/demo;src/demo", + # 隐藏导入 + "--hidden-import", "PyQt5", + "--hidden-import", "PyQt5.QtCore", + "--hidden-import", "PyQt5.QtGui", + "--hidden-import", "PyQt5.QtWidgets", + "--hidden-import", "requests", + "--hidden-import", "beautifulsoup4", + "--hidden-import", "python-docx", + "--hidden-import", "PyPDF2", + "--hidden-import", "ebooklib", + "--hidden-import", "chardet", + "--hidden-import", "PIL", + "--hidden-import", "pillow", + # 图标设置 + "--icon", "resources/icons/app_icon.ico" if os.path.exists("resources/icons/app_icon.ico") else "resources/icons/app_icon_256X256.png", + "--windowed", # 无控制台窗口 + "--noconfirm", + "--clean", # 清理临时文件 + "src/main.py" + ] + + print("运行PyInstaller...") + code, stdout, stderr = run_command(pyinstaller_cmd) + + if code != 0: + print(f"完整构建失败,尝试简化构建: {stderr}") + # 简化版本 + simple_cmd = [ + "pyinstaller", + "--onefile", + "--windowed", + "--icon=resources/icons/app_icon.ico" if os.path.exists("resources/icons/app_icon.ico") else "resources/icons/app_icon_256X256.png", + "--add-data=resources;resources", + "--add-data=resources/icons;resources/icons", + "--add-data=src;src", + "--name=MagicWord", + "--version=1.0.0", + "--clean", + "src/main.py" + ] + code, stdout, stderr = run_command(simple_cmd) + if code != 0: + print(f"简化构建也失败: {stderr}") + return False + + print("可执行文件构建成功") + return True + +def create_package(): + """创建发布包""" + print("创建发布包...") + + # 检查构建结果 + if platform.system() == "Windows": + exe_path = "dist/MagicWord.exe" + else: + exe_path = "dist/MagicWord" + + if not os.path.exists(exe_path): + print(f"错误: 找不到可执行文件 {exe_path}") + return False + + # 创建发布目录 + release_dir = "dist_package_v1.0" + if os.path.exists(release_dir): + shutil.rmtree(release_dir) + os.makedirs(release_dir) + + # 复制文件到发布目录 + files_to_copy = [ + (exe_path, "MagicWord.exe" if platform.system() == "Windows" else "MagicWord"), + ("README.md", "README.md"), + ("CHANGELOG.md", "CHANGELOG.md"), + ("requirements.txt", "requirements.txt"), + ("install_and_fix.py", "install_and_fix.py"), + ] + + for src, dst in files_to_copy: + if os.path.exists(src): + shutil.copy2(src, os.path.join(release_dir, dst)) + print(f"复制: {src} -> {dst}") + + # 复制图标文件到发布包 + icons_dir = os.path.join(release_dir, "icons") + if os.path.exists("resources/icons"): + shutil.copytree("resources/icons", icons_dir) + print("复制图标文件到发布包") + + # 创建运行脚本 + if platform.system() == "Windows": + run_script = """@echo off +echo MagicWord 1.0.0 启动中... +cd /d "%~dp0" +start MagicWord.exe +""" + with open(os.path.join(release_dir, "run.bat"), "w") as f: + f.write(run_script) + + # 创建桌面快捷方式脚本 + desktop_shortcut_script = """@echo off +echo 创建桌面快捷方式... +set SCRIPT_DIR=%~dp0 +set DESKTOP=%USERPROFILE%\Desktop +set SHORTCUT=%DESKTOP%\MagicWord.lnk +powershell -Command "$WshShell = New-Object -comObject WScript.Shell; $Shortcut = $WshShell.CreateShortcut('%SHORTCUT%'); $Shortcut.TargetPath = '%SCRIPT_DIR%MagicWord.exe'; $Shortcut.WorkingDirectory = '%SCRIPT_DIR%'; $Shortcut.IconLocation = '%SCRIPT_DIR%icons\\app_icon_256X256.png'; $Shortcut.Save()" +echo 桌面快捷方式创建完成! +pause +""" + with open(os.path.join(release_dir, "create_desktop_shortcut.bat"), "w") as f: + f.write(desktop_shortcut_script) + + else: + run_script = """#!/bin/bash +echo "MagicWord 1.0.0 启动中..." +cd "$(dirname "$0")" +./MagicWord & +""" + with open(os.path.join(release_dir, "run.sh"), "w") as f: + f.write(run_script) + os.chmod(os.path.join(release_dir, "run.sh"), 0o755) + + # 创建发布说明 + release_info = f"""MagicWord 1.0.0 发布包 +构建时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} +平台: {platform.system()} {platform.machine()} +Python版本: {platform.python_version()} + +快速开始: +1. 运行 install_and_fix.py 安装依赖(如果需要) +2. 运行 run.bat (Windows) 或 run.sh (Linux/Mac) +3. 或直接运行 MagicWord.exe + +功能特性: +- 完整的文档处理功能 +- 打字练习模式 +- 学习模式 +- 多种文档格式支持(Word, PDF, TXT等) +- 美观的Word风格界面 +- 完整的图标和界面资源 + +图标说明: +- 包含完整的图标资源文件 +- 支持多种尺寸的图标(32x32, 64x64, 128x128, 256x256) +- Windows版本包含ICO格式图标 +- 可创建桌面快捷方式 + +详细更新请查看 CHANGELOG.md +""" + + with open(os.path.join(release_dir, "发布说明.txt"), "w", encoding='utf-8') as f: + f.write(release_info) + + # 创建ZIP压缩包 + print("创建ZIP压缩包...") + zip_filename = f"MagicWord_v1.0.0_{platform.system()}_{platform.machine()}" + with zipfile.ZipFile(f"{zip_filename}.zip", 'w', zipfile.ZIP_DEFLATED) as zipf: + for root, dirs, files in os.walk(release_dir): + for file in files: + file_path = os.path.join(root, file) + arc_path = os.path.relpath(file_path, release_dir) + zipf.write(file_path, arc_path) + print(f"添加到压缩包: {arc_path}") + + print(f"发布包创建成功: {zip_filename}.zip") + return True + +def main(): + """主函数""" + print("=" * 50) + print("MagicWord 1.0.0 构建脚本") + print("=" * 50) + + # 检查Python版本 + if sys.version_info < (3, 6): + print("错误: 需要Python 3.6或更高版本") + return False + + # 清理构建目录 + clean_build_dirs() + + # 安装依赖 + if not install_dependencies(): + print("依赖安装失败") + return False + + # 构建可执行文件 + if not build_executable(): + print("可执行文件构建失败") + return False + + # 创建发布包 + if not create_package(): + print("发布包创建失败") + return False + + print("=" * 50) + print("构建完成!") + print("发布包位于: dist_package_v1.0/") + print("ZIP压缩包已创建") + print("=" * 50) + + return True + +if __name__ == "__main__": + success = main() + sys.exit(0 if success else 1) \ No newline at end of file diff --git a/package_v1.0.py b/package_v1.0.py new file mode 100644 index 0000000..9ba4472 --- /dev/null +++ b/package_v1.0.py @@ -0,0 +1,251 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +MagicWord 1.0.0 完整打包脚本 +创建包含所有资源的发布包 +""" + +import os +import sys +import shutil +import zipfile +from datetime import datetime + +def create_package(): + """创建完整的发布包""" + print("=" * 60) + print("MagicWord 1.0.0 完整打包程序") + print("=" * 60) + + # 检查可执行文件是否存在 + exe_path = "dist/MagicWord.exe" + if not os.path.exists(exe_path): + print(f"错误: 找不到可执行文件 {exe_path}") + print("请先运行PyInstaller构建可执行文件") + return False + + # 创建发布目录 + release_dir = "MagicWord_v1.0.0_Windows" + if os.path.exists(release_dir): + shutil.rmtree(release_dir) + os.makedirs(release_dir) + + print("创建发布包目录...") + + # 复制主要文件 + files_to_copy = [ + (exe_path, "MagicWord.exe"), + ("README.md", "README.md"), + ("CHANGELOG.md", "CHANGELOG.md"), + ("requirements.txt", "requirements.txt"), + ("install_and_fix.py", "install_and_fix.py"), + ] + + for src, dst in files_to_copy: + if os.path.exists(src): + shutil.copy2(src, os.path.join(release_dir, dst)) + print(f"✓ 复制: {src} -> {dst}") + else: + print(f"⚠ 跳过: {src} (文件不存在)") + + # 复制图标文件 + icons_dir = os.path.join(release_dir, "icons") + if os.path.exists("resources/icons"): + shutil.copytree("resources/icons", icons_dir) + print("✓ 复制图标文件到发布包") + + # 复制配置文件 + config_dir = os.path.join(release_dir, "config") + if os.path.exists("resources/config"): + shutil.copytree("resources/config", config_dir) + print("✓ 复制配置文件到发布包") + + # 复制样式文件 + qss_dir = os.path.join(release_dir, "qss") + if os.path.exists("resources/qss") and os.listdir("resources/qss"): + shutil.copytree("resources/qss", qss_dir) + print("✓ 复制样式文件到发布包") + + # 注意: UI图像文件已通过PyInstaller打包到可执行文件中 + # 程序会在运行时从打包的资源中加载 114514.png 和 UI.png + + # 创建运行脚本 + print("创建运行脚本...") + + # Windows运行脚本 + run_script = """@echo off +echo ======================================== +echo MagicWord 1.0.0 启动中... +echo ======================================== +cd /d "%~dp0" +start "" "MagicWord.exe" +echo 程序已启动! +timeout /t 3 /nobreak > nul +""" + + with open(os.path.join(release_dir, "运行程序.bat"), "w", encoding='utf-8') as f: + f.write(run_script) + + # 创建桌面快捷方式脚本 + desktop_shortcut_script = """@echo off +echo 正在创建桌面快捷方式... +cd /d "%~dp0" +set SCRIPT_DIR=%CD% +set DESKTOP=%USERPROFILE%\Desktop +set SHORTCUT=%DESKTOP%\MagicWord.lnk + +echo 脚本目录: %SCRIPT_DIR% +echo 桌面路径: %DESKTOP% + +powershell -Command " + $WshShell = New-Object -comObject WScript.Shell + $Shortcut = $WshShell.CreateShortcut('%SHORTCUT%') + $Shortcut.TargetPath = '%SCRIPT_DIR%\MagicWord.exe' + $Shortcut.WorkingDirectory = '%SCRIPT_DIR%' + $Shortcut.IconLocation = '%SCRIPT_DIR%\icons\app_icon_256X256.png' + $Shortcut.Description = 'MagicWord 1.0.0 - 隐私学习软件' + $Shortcut.Save() + Write-Host '桌面快捷方式创建成功!' -ForegroundColor Green +" + +if exist "%SHORTCUT%" ( + echo 桌面快捷方式创建成功! +) else ( + echo 桌面快捷方式创建失败! +) +echo. +echo 按任意键退出... +pause > nul +""" + + with open(os.path.join(release_dir, "创建桌面快捷方式.bat"), "w", encoding='utf-8') as f: + f.write(desktop_shortcut_script) + + # 创建安装说明 + install_guide = """MagicWord 1.0.0 安装使用说明 + +======================================== +系统要求 +======================================== +- Windows 7/8/10/11 (64位) +- 至少 100MB 可用磁盘空间 +- 建议内存: 4GB 以上 + +======================================== +快速开始 +======================================== +方法1: 直接运行 +1. 双击 "MagicWord.exe" 即可运行程序 + +方法2: 使用运行脚本 +1. 双击 "运行程序.bat" 自动启动程序 + +方法3: 创建桌面快捷方式 +1. 双击 "创建桌面快捷方式.bat" +2. 桌面上会出现 MagicWord 快捷方式 +3. 双击桌面快捷方式即可运行 + +======================================== +文件说明 +======================================== +MagicWord.exe - 主程序文件 +icons/ - 图标文件夹 + app_icon.ico - 应用程序图标 + app_icon_256X256.png - 256x256图标 + app_icon_128X128.png - 128x128图标 + app_icon_64X64.png - 64x64图标 + app_icon_32X32.png - 32x32图标 + +config/ - 配置文件 +README.md - 项目说明文档 +CHANGELOG.md - 更新日志 + +======================================== +卸载方法 +======================================== +直接删除整个 MagicWord 文件夹即可完全卸载 + +======================================== +技术支持 +======================================== +如有问题,请查看 README.md 文件或联系开发者 + +======================================== +版本信息 +======================================== +版本: 1.0.0 +构建时间: {build_time} +平台: Windows +架构: {architecture} + +祝您使用愉快! +""".format( + build_time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'), + architecture="64位" + ) + + with open(os.path.join(release_dir, "安装说明.txt"), "w", encoding='utf-8') as f: + f.write(install_guide) + + # 创建版本信息文件 + version_info = f"""MagicWord Version 1.0.0 +Build Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} +Platform: Windows +Architecture: 64-bit +Python Version: 3.13 +Qt Version: PyQt5 + +This is a standalone executable package containing all necessary dependencies. +""" + + with open(os.path.join(release_dir, "version.txt"), "w", encoding='utf-8') as f: + f.write(version_info) + + print("创建ZIP压缩包...") + + # 创建ZIP压缩包 + zip_filename = f"MagicWord_v1.0.0_Windows_64bit" + with zipfile.ZipFile(f"{zip_filename}.zip", 'w', zipfile.ZIP_DEFLATED) as zipf: + for root, dirs, files in os.walk(release_dir): + for file in files: + file_path = os.path.join(root, file) + arc_path = os.path.relpath(file_path, release_dir) + zipf.write(file_path, arc_path) + print(f"添加到压缩包: {arc_path}") + + print("=" * 60) + print("✅ 打包完成!") + print(f"📁 发布包目录: {release_dir}/") + print(f"📦 ZIP压缩包: {zip_filename}.zip") + print("=" * 60) + + # 显示发布包内容 + print("\n发布包内容:") + for root, dirs, files in os.walk(release_dir): + level = root.replace(release_dir, '').count(os.sep) + indent = ' ' * 2 * level + print(f"{indent}{os.path.basename(root)}/") + subindent = ' ' * 2 * (level + 1) + for file in files: + print(f"{subindent}{file}") + + return True + +def main(): + """主函数""" + try: + success = create_package() + if success: + print("\n🎉 所有文件已成功打包!") + print("您可以分发 ZIP 文件给用户。") + else: + print("\n❌ 打包过程中出现错误。") + return 1 + except Exception as e: + print(f"\n❌ 发生错误: {e}") + return 1 + + return 0 + +if __name__ == "__main__": + sys.exit(main()) \ No newline at end of file diff --git a/resources/icons/app_icon.ico b/resources/icons/app_icon.ico new file mode 100644 index 0000000..9a97f72 Binary files /dev/null and b/resources/icons/app_icon.ico differ diff --git a/setup.py b/setup.py index f509b1c..8589459 100644 --- a/setup.py +++ b/setup.py @@ -2,12 +2,15 @@ from setuptools import setup, find_packages setup( name="MagicWord", - version="0.3.0", + version="1.0.0", description="隐私学习软件 - 一款通过打字练习来学习文档内容的工具", author="MagicWord Team", packages=find_packages(where="src"), package_dir={"": "src"}, include_package_data=True, + package_data={ + "": ["*.png", "*.ico", "*.json", "*.qss", "*.txt"], + }, install_requires=[ "python-docx>=0.8.10", "PyPDF2>=1.26.0", @@ -24,4 +27,17 @@ setup( ], }, python_requires=">=3.6", + classifiers=[ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: End Users/Desktop", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Topic :: Education", + "Topic :: Office/Business", + ], ) \ No newline at end of file diff --git a/src/main.py b/src/main.py index b119247..de007be 100644 --- a/src/main.py +++ b/src/main.py @@ -85,7 +85,7 @@ def main(): # 设置应用程序属性 app.setApplicationName("MagicWord") - app.setApplicationVersion("0.2.2") + app.setApplicationVersion("1.0.0") app.setOrganizationName("MagicWord") # 设置窗口图标(如果存在) diff --git a/src/ui/ui.txt b/src/ui/ui.txt deleted file mode 100644 index e69de29..0000000 diff --git a/字体颜色功能说明.md b/字体颜色功能说明.md deleted file mode 100644 index 5f2b43e..0000000 --- a/字体颜色功能说明.md +++ /dev/null @@ -1,88 +0,0 @@ -# 字体颜色功能说明 - -我已经成功为你的MagicWord应用添加了字体颜色工具!以下是添加的功能: - -## 🎯 重要更新:保留之前内容的颜色 - -**根据你的需求,字体颜色功能已修改为保留原有内容的颜色!** - -### 修改后的功能特性 -- ✅ **保留原有内容颜色**:已有文本的颜色完全保持不变 -- ✅ **只影响新输入**:新输入的文本将使用选定的颜色 -- ✅ **智能提示**:选择文本时会提示颜色只对新输入生效 -- ✅ **向后兼容**:不会影响现有的粗体、斜体、下划线等格式 - -## 新增功能 - -### 1. 字体颜色按钮 -- 在"开始"标签页的"字体"组中,添加了一个新的颜色按钮(显示为"A") -- 该按钮位于加粗(B)、斜体(I)、下划线(U)按钮的右侧 - -### 2. 颜色选择功能 -- 点击颜色按钮会弹出颜色选择对话框 -- 用户可以选择任意颜色 -- **重要**:只影响后续输入的文本,不会改变已有内容的颜色 - -## 技术实现 - -### UI界面修改 -1. **word_style_ui.py** 中添加了: - - `color_btn` 按钮创建 - - `create_color_button()` 方法用于创建颜色按钮 - - `on_color_clicked()` 方法作为按钮点击事件的处理函数 - -2. **word_main_window.py** 中修改了: - - 颜色按钮的信号连接 - - `on_color_clicked()` 方法:简化为只设置默认颜色,不影响已有内容 - -### 功能特性 -- 使用 PyQt5 的 `QColorDialog` 提供颜色选择界面 -- **只设置默认文本颜色**,不修改已有内容的格式 -- 智能状态栏提示,告知用户颜色的应用范围 -- 保持与现有字体样式(粗体、斜体、下划线)的一致性 - -## 使用方法 - -### 设置新文本颜色 -1. 点击颜色按钮(A) -2. 在弹出的颜色对话框中选择所需颜色 -3. 点击"确定" -4. **后续输入的所有文本都将使用该颜色** -5. **已有文本的颜色完全保持不变** - -### 颜色选择提示 -- 如果选择了文本,会提示:"字体颜色已设置,新输入的文本将使用该颜色" -- 如果没有选择文本,会显示新颜色的具体信息 - -## 界面位置 - -字体颜色工具位于: -开始标签页 → 字体组 → 样式按钮区域(B、I、U按钮右侧) - -## 🔧 技术实现细节 - -### 修改后的核心逻辑 -```python -def on_color_clicked(self): - """字体颜色按钮点击处理 - 保留之前内容的颜色""" - # 只设置后续输入的默认颜色,不影响已有内容 - self.text_edit.setTextColor(color) - - # 友好的用户提示 - if cursor.hasSelection(): - self.status_bar.showMessage("字体颜色已设置,新输入的文本将使用该颜色", 2000) -``` - -这个实现确保: -- ✅ 用户可以自由设置新文本的颜色 -- ✅ 所有已有内容的颜色完全保留 -- ✅ 用户体验友好,有明确的操作反馈 - -## 🚀 优势 - -1. **非破坏性**:不会意外改变已有内容的格式 -2. **直观易用**:用户明确知道颜色设置的影响范围 -3. **灵活性高**:可以随时更改新文本的颜色而不影响历史内容 -4. **兼容性好**:与所有现有功能完美配合 - -这个新增功能与现有的字体样式工具完美集成,提供了完整且安全的文本格式化能力! \ No newline at end of file