123 #88

Merged
pshjeamgr merged 1 commits from main into llllllllllllllCC 4 months ago

@ -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)

@ -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())

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

@ -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",
],
)

@ -85,7 +85,7 @@ def main():
# 设置应用程序属性
app.setApplicationName("MagicWord")
app.setApplicationVersion("0.2.2")
app.setApplicationVersion("1.0.0")
app.setOrganizationName("MagicWord")
# 设置窗口图标(如果存在)

@ -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. **兼容性好**:与所有现有功能完美配合
这个新增功能与现有的字体样式工具完美集成,提供了完整且安全的文本格式化能力!
Loading…
Cancel
Save