fix:更新项目说明文档
This commit is contained in:
34
.idea/workspace.xml
generated
34
.idea/workspace.xml
generated
@@ -4,21 +4,12 @@
|
|||||||
<option name="autoReloadType" value="SELECTIVE" />
|
<option name="autoReloadType" value="SELECTIVE" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="e258c58a-2a5f-4fad-9d39-8dc186b6b5a7" name="更改" comment="fix:修复一些BUG">
|
<list default="true" id="e258c58a-2a5f-4fad-9d39-8dc186b6b5a7" name="更改" comment="fix:添加niceGui库美化页面">
|
||||||
<change afterPath="$PROJECT_DIR$/main_nicegui.py" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/script/setup_nicegui.py" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/ui/assets/icon.ico" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/ui/assets/style.css" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/ui/core/logger.py" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/ui/core/state.py" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/ui/core/task_runner.py" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/ui/views/home_page.py" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/data/names.xlsx" beforeDir="false" afterPath="$PROJECT_DIR$/data/names.xlsx" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/IFLOW.md" beforeDir="false" afterPath="$PROJECT_DIR$/IFLOW.md" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/pyproject.toml" beforeDir="false" afterPath="$PROJECT_DIR$/pyproject.toml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/script/setup.py" beforeDir="false" afterPath="$PROJECT_DIR$/script/setup.py" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/main_nicegui.py" beforeDir="false" afterPath="$PROJECT_DIR$/main_nicegui.py" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/utils/file_utils.py" beforeDir="false" afterPath="$PROJECT_DIR$/utils/file_utils.py" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/script/setup_nicegui.py" beforeDir="false" afterPath="$PROJECT_DIR$/script/setup_nicegui.py" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/uv.lock" beforeDir="false" afterPath="$PROJECT_DIR$/uv.lock" afterDir="false" />
|
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
@@ -163,7 +154,7 @@
|
|||||||
<updated>1765613055475</updated>
|
<updated>1765613055475</updated>
|
||||||
<workItem from="1765613057798" duration="372000" />
|
<workItem from="1765613057798" duration="372000" />
|
||||||
<workItem from="1765613448098" duration="48000" />
|
<workItem from="1765613448098" duration="48000" />
|
||||||
<workItem from="1765613503892" duration="15577000" />
|
<workItem from="1765613503892" duration="18548000" />
|
||||||
</task>
|
</task>
|
||||||
<task id="LOCAL-00001" summary="fix:修复一些BUG">
|
<task id="LOCAL-00001" summary="fix:修复一些BUG">
|
||||||
<option name="closed" value="true" />
|
<option name="closed" value="true" />
|
||||||
@@ -173,7 +164,15 @@
|
|||||||
<option name="project" value="LOCAL" />
|
<option name="project" value="LOCAL" />
|
||||||
<updated>1765626269402</updated>
|
<updated>1765626269402</updated>
|
||||||
</task>
|
</task>
|
||||||
<option name="localTasksCounter" value="2" />
|
<task id="LOCAL-00002" summary="fix:添加niceGui库美化页面">
|
||||||
|
<option name="closed" value="true" />
|
||||||
|
<created>1765631607389</created>
|
||||||
|
<option name="number" value="00002" />
|
||||||
|
<option name="presentableId" value="LOCAL-00002" />
|
||||||
|
<option name="project" value="LOCAL" />
|
||||||
|
<updated>1765631607389</updated>
|
||||||
|
</task>
|
||||||
|
<option name="localTasksCounter" value="3" />
|
||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
<component name="TypeScriptGeneratedFilesManager">
|
<component name="TypeScriptGeneratedFilesManager">
|
||||||
@@ -181,7 +180,8 @@
|
|||||||
</component>
|
</component>
|
||||||
<component name="VcsManagerConfiguration">
|
<component name="VcsManagerConfiguration">
|
||||||
<MESSAGE value="fix:修复一些BUG" />
|
<MESSAGE value="fix:修复一些BUG" />
|
||||||
<option name="LAST_COMMIT_MESSAGE" value="fix:修复一些BUG" />
|
<MESSAGE value="fix:添加niceGui库美化页面" />
|
||||||
|
<option name="LAST_COMMIT_MESSAGE" value="fix:添加niceGui库美化页面" />
|
||||||
</component>
|
</component>
|
||||||
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
||||||
<SUITE FILE_PATH="coverage/growth_report$main_pyw.coverage" NAME="main.pyw 覆盖结果" MODIFIED="1765626787983" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
<SUITE FILE_PATH="coverage/growth_report$main_pyw.coverage" NAME="main.pyw 覆盖结果" MODIFIED="1765626787983" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
||||||
|
|||||||
34
IFLOW.md
34
IFLOW.md
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## 项目概述
|
## 项目概述
|
||||||
|
|
||||||
这是一个基于Python的自动化幼儿园成长报告生成系统。该系统可以从Excel数据文件中读取幼儿信息,结合AI生成个性化评语,并将所有信息批量填充到PPT模板中,最终生成每个学生的个性化成长报告。系统支持双界面运行(命令行界面和图形界面),具备字体安装、图片替换、批量PDF转换、生肖计算等功能。
|
这是一个基于Python的自动化幼儿园成长报告生成系统。该系统可以从Excel数据文件中读取幼儿信息,结合AI生成个性化评语,并将所有信息批量填充到PPT模板中,最终生成每个学生的个性化成长报告。系统支持双界面运行(命令行界面、图形界面和NiceGUI界面),具备字体安装、图片替换、批量PDF转换、生肖计算等功能。
|
||||||
|
|
||||||
## 技术栈
|
## 技术栈
|
||||||
|
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
- **loguru**: 日志记录
|
- **loguru**: 日志记录
|
||||||
- **tomli**: 配置文件解析
|
- **tomli**: 配置文件解析
|
||||||
- **tkinter**: 图形用户界面
|
- **tkinter**: 图形用户界面
|
||||||
|
- **nicegui**: 现代Web界面
|
||||||
|
|
||||||
## 核心功能
|
## 核心功能
|
||||||
|
|
||||||
@@ -66,7 +67,9 @@
|
|||||||
```
|
```
|
||||||
growth_report/
|
growth_report/
|
||||||
├── main.py # 主程序入口(命令行界面)
|
├── main.py # 主程序入口(命令行界面)
|
||||||
├── UI.py # 图形用户界面入口
|
├── UI.py # 图形用户界面入口(tkinter)
|
||||||
|
├── main_nicegui.py # NiceGUI界面入口
|
||||||
|
├── main.pyw # Windows图形界面启动文件
|
||||||
├── config.env.toml # 项目配置文件
|
├── config.env.toml # 项目配置文件
|
||||||
├── pyproject.toml # 项目依赖配置
|
├── pyproject.toml # 项目依赖配置
|
||||||
├── start_app.bat # Windows启动批处理文件
|
├── start_app.bat # Windows启动批处理文件
|
||||||
@@ -75,6 +78,19 @@ growth_report/
|
|||||||
├── config/
|
├── config/
|
||||||
│ ├── config.py # 配置加载工具
|
│ ├── config.py # 配置加载工具
|
||||||
│ └── output/ # 配置输出目录
|
│ └── output/ # 配置输出目录
|
||||||
|
├── ui/
|
||||||
|
│ ├── app_window.py # tkinter图形界面
|
||||||
|
│ ├── main_nicegui.py # NiceGUI界面主文件
|
||||||
|
│ ├── assets/
|
||||||
|
│ │ ├── icon.ico # 应用图标
|
||||||
|
│ │ └── style.css # 样式文件
|
||||||
|
│ ├── core/
|
||||||
|
│ │ ├── logger.py # 日志处理
|
||||||
|
│ │ ├── state.py # 应用状态管理
|
||||||
|
│ │ ├── task_runner.py # 任务运行器
|
||||||
|
│ │ └── __pycache__/
|
||||||
|
│ └── views/
|
||||||
|
│ └── home_page.py # NiceGUI主页面
|
||||||
├── utils/
|
├── utils/
|
||||||
│ ├── agent_utils.py # AI评语生成工具
|
│ ├── agent_utils.py # AI评语生成工具
|
||||||
│ ├── file_utils.py # 文件操作工具
|
│ ├── file_utils.py # 文件操作工具
|
||||||
@@ -82,6 +98,7 @@ growth_report/
|
|||||||
│ ├── generate_utils.py # 核心生成功能
|
│ ├── generate_utils.py # 核心生成功能
|
||||||
│ ├── growt_utils.py # PPT模板替换工具
|
│ ├── growt_utils.py # PPT模板替换工具
|
||||||
│ ├── image_utils.py # 图片处理工具
|
│ ├── image_utils.py # 图片处理工具
|
||||||
|
│ ├── log_handler.py # 日志处理器
|
||||||
│ ├── pdf_utils.py # PDF转换工具
|
│ ├── pdf_utils.py # PDF转换工具
|
||||||
│ ├── pptx_utils.py # PPT文本和图片替换工具
|
│ ├── pptx_utils.py # PPT文本和图片替换工具
|
||||||
│ └── zodiac_utils.py # 生肖计算工具
|
│ └── zodiac_utils.py # 生肖计算工具
|
||||||
@@ -153,11 +170,16 @@ data/images/
|
|||||||
python main.py
|
python main.py
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 图形界面
|
#### 图形界面 (tkinter)
|
||||||
```bash
|
```bash
|
||||||
python UI.py
|
python UI.py
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### NiceGUI界面 (现代Web界面)
|
||||||
|
```bash
|
||||||
|
python main_nicegui.py
|
||||||
|
```
|
||||||
|
|
||||||
或直接运行批处理文件:
|
或直接运行批处理文件:
|
||||||
```bash
|
```bash
|
||||||
start_app.bat
|
start_app.bat
|
||||||
@@ -184,11 +206,11 @@ pip install -r requirements.txt
|
|||||||
|
|
||||||
## 系统特点
|
## 系统特点
|
||||||
|
|
||||||
- **双界面支持**: 提供命令行界面和图形界面两种操作方式
|
- **三界面支持**: 提供命令行界面、tkinter图形界面和NiceGUI现代Web界面三种操作方式
|
||||||
- **自动化流程**: 从数据到成品报告的全流程自动化
|
- **自动化流程**: 从数据到成品报告的全流程自动化
|
||||||
- **AI集成**: 智能生成个性化评语
|
- **AI集成**: 智能生成个性化评语
|
||||||
- **格式保持**: 替换文本时保持原有格式
|
- **格式保持**: 替换文本时保持原有格式
|
||||||
- **用户友好**: 丰富的命令行界面和图形界面,实时日志显示
|
- **用户友好**: 丰富的命令行界面和多种图形界面,实时日志显示
|
||||||
- **批量处理**: 支持批量生成和转换
|
- **批量处理**: 支持批量生成和转换
|
||||||
- **错误处理**: 完善的异常处理和日志记录
|
- **错误处理**: 完善的异常处理和日志记录
|
||||||
- **生肖计算**: 自动根据生日计算生肖
|
- **生肖计算**: 自动根据生日计算生肖
|
||||||
@@ -200,7 +222,7 @@ pip install -r requirements.txt
|
|||||||
|
|
||||||
- 使用`loguru`进行日志记录
|
- 使用`loguru`进行日志记录
|
||||||
- 使用`rich`美化命令行输出
|
- 使用`rich`美化命令行输出
|
||||||
- 使用`tkinter`构建图形界面
|
- 使用`tkinter`和`nicegui`构建图形界面
|
||||||
- 配置文件使用TOML格式
|
- 配置文件使用TOML格式
|
||||||
- 图片和文本替换使用占位符机制
|
- 图片和文本替换使用占位符机制
|
||||||
- 遵循Python代码规范
|
- 遵循Python代码规范
|
||||||
|
|||||||
30
README.md
30
README.md
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
## 项目概述
|
## 项目概述
|
||||||
|
|
||||||
基于Python的自动化幼儿园学期成长报告生成系统。该系统可以从Excel数据文件中读取幼儿信息,结合AI生成个性化评语,并将所有信息批量填充到PPT模板中,最终生成每个学生的个性化成长报告。系统支持双界面操作(命令行界面和图形界面),具备字体安装、图片替换、批量PDF转换、生肖计算、模板导出等完整功能。
|
基于Python的自动化幼儿园学期成长报告生成系统。该系统可以从Excel数据文件中读取幼儿信息,结合AI生成个性化评语,并将所有信息批量填充到PPT模板中,最终生成每个学生的个性化成长报告。系统支持三界面操作(命令行界面、图形界面和NiceGUI界面),具备字体安装、图片替换、批量PDF转换、生肖计算、模板导出等完整功能。
|
||||||
|
|
||||||
## ✨ 主要特性
|
## ✨ 主要特性
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
- 🤖 **AI评语**: 智能生成个性化、治愈系风格的幼儿评语
|
- 🤖 **AI评语**: 智能生成个性化、治愈系风格的幼儿评语
|
||||||
- 🖼️ **图文并茂**: 支持个人照片、活动照片、班级合影的自动替换
|
- 🖼️ **图文并茂**: 支持个人照片、活动照片、班级合影的自动替换
|
||||||
- 📄 **格式转换**: 批量PPT转PDF,便于分发和存档
|
- 📄 **格式转换**: 批量PPT转PDF,便于分发和存档
|
||||||
- 🎨 **双界面**: 提供命令行界面和图形界面,满足不同用户需求
|
- 🎨 **多界面**: 提供命令行界面、tkinter图形界面和NiceGUI现代Web界面,满足不同用户需求
|
||||||
- 🐲 **生肖计算**: 根据生日自动计算生肖信息
|
- 🐲 **生肖计算**: 根据生日自动计算生肖信息
|
||||||
- 📦 **模板导出**: 生成标准化数据模板,快速上手
|
- 📦 **模板导出**: 生成标准化数据模板,快速上手
|
||||||
- 🔤 **字体安装**: 自动检测和安装所需字体文件
|
- 🔤 **字体安装**: 自动检测和安装所需字体文件
|
||||||
@@ -28,6 +28,7 @@
|
|||||||
- **rich**: 美化命令行界面
|
- **rich**: 美化命令行界面
|
||||||
- **loguru**: 日志记录
|
- **loguru**: 日志记录
|
||||||
- **tkinter**: 图形用户界面
|
- **tkinter**: 图形用户界面
|
||||||
|
- **nicegui**: 现代Web界面
|
||||||
- **tomli**: 配置文件解析
|
- **tomli**: 配置文件解析
|
||||||
|
|
||||||
## 📋 系统要求
|
## 📋 系统要求
|
||||||
@@ -67,7 +68,12 @@ pip install -r requirements.txt
|
|||||||
|
|
||||||
### 4. 运行程序
|
### 4. 运行程序
|
||||||
|
|
||||||
#### 图形界面(推荐)
|
#### NiceGUI界面(推荐,现代Web界面)
|
||||||
|
```bash
|
||||||
|
python main_nicegui.py
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 图形界面(tkinter界面)
|
||||||
```bash
|
```bash
|
||||||
python UI.py
|
python UI.py
|
||||||
```
|
```
|
||||||
@@ -131,7 +137,9 @@ data/images/
|
|||||||
```
|
```
|
||||||
growth_report/
|
growth_report/
|
||||||
├── main.py # 主程序入口(命令行界面)
|
├── main.py # 主程序入口(命令行界面)
|
||||||
├── UI.py # 图形用户界面入口
|
├── UI.py # 图形用户界面入口(tkinter)
|
||||||
|
├── main_nicegui.py # NiceGUI界面入口
|
||||||
|
├── main.pyw # Windows图形界面启动文件
|
||||||
├── config.env.toml # 项目配置文件
|
├── config.env.toml # 项目配置文件
|
||||||
├── pyproject.toml # 项目依赖配置
|
├── pyproject.toml # 项目依赖配置
|
||||||
├── start_app.bat # 启动脚本
|
├── start_app.bat # 启动脚本
|
||||||
@@ -140,6 +148,19 @@ growth_report/
|
|||||||
├── config/
|
├── config/
|
||||||
│ ├── config.py # 配置加载工具
|
│ ├── config.py # 配置加载工具
|
||||||
│ └── output/ # 配置输出目录
|
│ └── output/ # 配置输出目录
|
||||||
|
├── ui/
|
||||||
|
│ ├── app_window.py # tkinter图形界面
|
||||||
|
│ ├── main_nicegui.py # NiceGUI界面主文件
|
||||||
|
│ ├── assets/
|
||||||
|
│ │ ├── icon.ico # 应用图标
|
||||||
|
│ │ └── style.css # 样式文件
|
||||||
|
│ ├── core/
|
||||||
|
│ │ ├── logger.py # 日志处理
|
||||||
|
│ │ ├── state.py # 应用状态管理
|
||||||
|
│ │ ├── task_runner.py # 任务运行器
|
||||||
|
│ │ └── __pycache__/
|
||||||
|
│ └── views/
|
||||||
|
│ └── home_page.py # NiceGUI主页面
|
||||||
├── utils/
|
├── utils/
|
||||||
│ ├── agent_utils.py # AI评语生成工具
|
│ ├── agent_utils.py # AI评语生成工具
|
||||||
│ ├── file_utils.py # 文件操作工具
|
│ ├── file_utils.py # 文件操作工具
|
||||||
@@ -147,6 +168,7 @@ growth_report/
|
|||||||
│ ├── generate_utils.py # 核心生成功能
|
│ ├── generate_utils.py # 核心生成功能
|
||||||
│ ├── growt_utils.py # PPT模板替换工具
|
│ ├── growt_utils.py # PPT模板替换工具
|
||||||
│ ├── image_utils.py # 图片处理工具
|
│ ├── image_utils.py # 图片处理工具
|
||||||
|
│ ├── log_handler.py # 日志处理器
|
||||||
│ ├── pdf_utils.py # PDF转换工具
|
│ ├── pdf_utils.py # PDF转换工具
|
||||||
│ ├── pptx_utils.py # PPT文本和图片替换工具
|
│ ├── pptx_utils.py # PPT文本和图片替换工具
|
||||||
│ └── zodiac_utils.py # 生肖计算工具
|
│ └── zodiac_utils.py # 生肖计算工具
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from nicegui import ui, app, run
|
from nicegui import ui, app, run, native
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
# 导入我们的模块
|
# 导入我们的模块
|
||||||
@@ -9,12 +9,15 @@ from config.config import load_config
|
|||||||
from ui.core.logger import setup_logger
|
from ui.core.logger import setup_logger
|
||||||
from utils.font_utils import install_fonts_from_directory
|
from utils.font_utils import install_fonts_from_directory
|
||||||
from ui.views.home_page import create_page
|
from ui.views.home_page import create_page
|
||||||
|
sys.stdout.reconfigure(encoding='utf-8')
|
||||||
|
sys.stderr.reconfigure(encoding='utf-8')
|
||||||
# 1. 初始化配置
|
# 1. 初始化配置
|
||||||
config = load_config("config.toml")
|
config = load_config("config.toml")
|
||||||
setup_logger()
|
setup_logger()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# === 关键修改:定义一个获取路径的通用函数 ===
|
# === 关键修改:定义一个获取路径的通用函数 ===
|
||||||
def get_path(relative_path):
|
def get_path(relative_path):
|
||||||
"""
|
"""
|
||||||
@@ -60,5 +63,6 @@ if __name__ in {"__main__", "__mp_main__"}:
|
|||||||
title="尚城幼儿园成长报告助手",
|
title="尚城幼儿园成长报告助手",
|
||||||
native=True,
|
native=True,
|
||||||
window_size=(900, 900),
|
window_size=(900, 900),
|
||||||
|
port=native.find_open_port(), # 自动寻找端口
|
||||||
reload=False
|
reload=False
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,31 +5,36 @@ import shutil
|
|||||||
import platform
|
import platform
|
||||||
|
|
||||||
MAIN_FILE = "main_nicegui.py"
|
MAIN_FILE = "main_nicegui.py"
|
||||||
|
# 【关键修改】提取应用名称为变量,确保打包目录和复制目录一致
|
||||||
|
APP_NAME = "尚城幼儿园幼儿学期发展报告"
|
||||||
|
|
||||||
|
|
||||||
def copy_resources():
|
def copy_resources():
|
||||||
"""
|
"""
|
||||||
将资源文件从项目根目录复制到 dist 文件夹中,
|
将资源文件从项目根目录复制到 dist/APP_NAME 文件夹中 (与 exe 同级),
|
||||||
以便用户可以直接在 exe 旁边修改这些文件。
|
以便用户可以直接在 exe 旁边修改这些文件。
|
||||||
"""
|
"""
|
||||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
project_root = os.path.dirname(current_dir)
|
project_root = os.path.dirname(current_dir)
|
||||||
dist_dir = os.path.join(current_dir, "dist")
|
|
||||||
|
# 【关键修改】目标目录改为 dist/APP_NAME
|
||||||
|
# 这样资源文件才会出现在 exe 旁边,而不是 dist 根目录
|
||||||
|
dist_dir = os.path.join(current_dir, "dist", APP_NAME)
|
||||||
|
|
||||||
print(f"\n--- 正在复制外部资源到 {dist_dir} ---")
|
print(f"\n--- 正在复制外部资源到 {dist_dir} ---")
|
||||||
|
|
||||||
if not os.path.exists(dist_dir):
|
if not os.path.exists(dist_dir):
|
||||||
print("错误: dist 文件夹不存在,请先运行打包。")
|
print(f"错误: 目标文件夹不存在: {dist_dir}")
|
||||||
|
print("请检查是否打包成功,或者是否使用了 --onedir 模式。")
|
||||||
return
|
return
|
||||||
|
|
||||||
# 这里的列表是【给用户看/改的】,不用把 ui/assets 放这里,除非你希望用户改CSS
|
# 这里的列表是【给用户看/改的】
|
||||||
resources_to_copy = [
|
resources_to_copy = [
|
||||||
("config.toml", ""),
|
("config.toml", ""),
|
||||||
("fonts", "fonts"),
|
("fonts", "fonts"),
|
||||||
("data", "data"),
|
("data", "data"),
|
||||||
("templates", "templates"),
|
("templates", "templates"),
|
||||||
("public", "public"),
|
("public", "public"),
|
||||||
# ui/assets 通常不需要用户改,所以这里可以不复制到外部,只打在包里即可
|
|
||||||
# 但如果你希望用户能自定义 logo,也可以复制出来
|
|
||||||
]
|
]
|
||||||
|
|
||||||
for src_name, dest_name in resources_to_copy:
|
for src_name, dest_name in resources_to_copy:
|
||||||
@@ -41,6 +46,7 @@ def copy_resources():
|
|||||||
shutil.copy2(src_path, dest_path)
|
shutil.copy2(src_path, dest_path)
|
||||||
print(f"✅ 已复制文件: {src_name}")
|
print(f"✅ 已复制文件: {src_name}")
|
||||||
elif os.path.isdir(src_path):
|
elif os.path.isdir(src_path):
|
||||||
|
# dirs_exist_ok=True 允许覆盖已存在的目录(Python 3.8+)
|
||||||
shutil.copytree(src_path, dest_path, dirs_exist_ok=True)
|
shutil.copytree(src_path, dest_path, dirs_exist_ok=True)
|
||||||
print(f"✅ 已复制目录: {src_name}")
|
print(f"✅ 已复制目录: {src_name}")
|
||||||
else:
|
else:
|
||||||
@@ -48,53 +54,54 @@ def copy_resources():
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"❌ 复制失败 {src_name}: {e}")
|
print(f"❌ 复制失败 {src_name}: {e}")
|
||||||
|
|
||||||
|
|
||||||
def build_exe():
|
def build_exe():
|
||||||
"""使用 PyInstaller 打包"""
|
"""使用 PyInstaller 打包"""
|
||||||
|
|
||||||
# 1. 确定当前系统的分隔符 (Windows用';', Linux/Mac用':')
|
|
||||||
sep = ';' if platform.system() == "Windows" else ':'
|
sep = ';' if platform.system() == "Windows" else ':'
|
||||||
|
|
||||||
# 2. 定义内部资源 (打入 exe 肚子里的)
|
# 内部资源 (打入 exe 内部的)
|
||||||
# 格式: "源路径{sep}目标路径"
|
|
||||||
resource_paths = [
|
resource_paths = [
|
||||||
f"../config.toml{sep}.", # 默认配置
|
f"../config.toml{sep}.",
|
||||||
f"../fonts{sep}fonts", # 字体 (程序可能需要内部路径)
|
f"../fonts{sep}fonts",
|
||||||
f"../templates{sep}templates", # 模板
|
f"../templates{sep}templates",
|
||||||
f"../ui/assets{sep}ui/assets", # <--- 关键修复:添加 UI 静态资源
|
f"../ui/assets{sep}ui/assets",
|
||||||
# public 和 data 如果体积太大且只在运行时读取,可以不打入包内,只保留外部复制
|
|
||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
command = [
|
command = [
|
||||||
sys.executable, "-m", "PyInstaller",
|
sys.executable, "-m", "PyInstaller",
|
||||||
"--onefile",
|
"--onedir", # 文件夹模式
|
||||||
"--windowed", # 建议:先注释掉这行,打包出来先看黑框有没有报错,没问题了再开启
|
"--windowed", # 隐藏控制台 (调试时建议先注释掉)
|
||||||
"--name=尚城幼儿园幼儿学期发展报告",
|
f"--name={APP_NAME}", # 【关键修改】使用变量
|
||||||
"--clean", # 清理缓存,避免旧文件干扰
|
"--clean",
|
||||||
"--distpath=./dist", # 明确输出目录
|
"--distpath=./dist",
|
||||||
"--workpath=./build",
|
"--workpath=./build",
|
||||||
"--icon=../public/icon.ico", # 确保你真有这个图标,否则会报错
|
"--icon=../public/icon.ico",
|
||||||
"../" + MAIN_FILE
|
"../" + MAIN_FILE
|
||||||
]
|
]
|
||||||
|
|
||||||
# 添加 --add-data 参数
|
|
||||||
for res in resource_paths:
|
for res in resource_paths:
|
||||||
command.append(f"--add-data={res}")
|
command.append(f"--add-data={res}")
|
||||||
|
|
||||||
# 添加 hidden-import (NiceGUI 常见缺失)
|
|
||||||
command.extend(["--hidden-import=nicegui", "--hidden-import=uvicorn"])
|
command.extend(["--hidden-import=nicegui", "--hidden-import=uvicorn"])
|
||||||
|
|
||||||
print("--- 开始打包 (PyInstaller) ---")
|
print("--- 开始打包 (PyInstaller) ---")
|
||||||
subprocess.run(command, check=True, cwd=os.path.dirname(os.path.abspath(__file__)))
|
subprocess.run(command, check=True, cwd=os.path.dirname(os.path.abspath(__file__)))
|
||||||
print("\n--- PyInstaller 打包完成!---")
|
print("\n--- PyInstaller 打包完成!---")
|
||||||
|
|
||||||
|
# 打包完成后执行复制
|
||||||
copy_resources()
|
copy_resources()
|
||||||
print(f"\n🎉 全部完成!请查看 'dist' 文件夹。")
|
|
||||||
|
# 打印最终 exe 的位置提示
|
||||||
|
exe_path = os.path.join("dist", APP_NAME, f"{APP_NAME}.exe")
|
||||||
|
print(f"\n🎉 全部完成!可执行文件位于: {exe_path}")
|
||||||
|
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
print(f"\n❌ 打包失败: {e}")
|
print(f"\n❌ 打包失败: {e}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"\n❌ 发生错误: {e}")
|
print(f"\n❌ 发生错误: {e}")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
build_exe()
|
build_exe()
|
||||||
Reference in New Issue
Block a user