English Version:ReadmeEN
一个为 Conda 环境设计的、美观易用的 PyInstaller 图形化打包工具。
pyinstaller -F --paths=E:\anaconda3\envs\yt_dlp_env\Lib\site-packages --python=E:\anaconda3\envs\yt_dlp_env\python.exe --noconsole --icon=wx2.ico --name=Downloader test.py
这是一句常用的 pyinstaller打包的命令,但每次都手动输入这一长串命令,很是麻烦。
本项目最初是使用 Tkinter 实现的一个简单的打包程序。现在,它已经演进为一个功能丰富、界面美观的 PyQt6 应用,旨在解决直接使用 pyinstaller 命令行时参数复杂、配置繁琐的问题。
此工具特别为使用 Conda 进行环境管理的 Python 开发者设计,能够自动检测并列出您的 Conda 虚拟环境,极大地简化了路径配置过程。您只需通过几次点击,即可完成对 Python 脚本的打包,无需记忆复杂的命令。
- 美观的图形用户界面:采用 PyQt6 构建,提供清爽的左右分栏布局,配置区和日志区一目了然。
- 主题切换:内置亮色和暗色两套主题,可根据个人喜好一键切换。
- 深度 Conda 集成:
- 自动扫描并列出所有本地 Conda 虚拟环境。
- 选择环境后,自动填充该环境的 Python 解释器路径和
site-packages路径。
- 智能依赖检查:在构建开始前,自动检查所选环境中是否安装了
pyinstaller,如果未安装,会提示用户一键安装。 - 全面的打包选项:
- 基本选项:支持单文件 (
-F) 和单目录 (-D) 模式切换、自定义程序名称 (--name)、添加图标 (--icon)、隐藏控制台 (--noconsole) 等常用功能。 - 高级选项:支持通过图形界面添加附加数据文件/目录 (
--add-data)、添加隐藏的模块导入 (--hidden-import) 等。
- 基本选项:支持单文件 (
- 实时日志输出:在独立的线程中执行打包命令,构建过程的日志会实时显示在右侧的日志窗口中,界面不会卡顿。
- 统一的输出管理:所有 PyInstaller 生成的文件(
build目录、dist目录、.spec文件)都会被统一整理到源脚本同级目录下的output文件夹中,保持项目根目录的整洁。 - 便捷操作:打包成功后,“打开输出目录”按钮会被激活,可以一键直达生成的可执行文件所在的位置。
在运行此程序之前,请确保您的系统满足以下条件:
- Python: 3.8 或更高版本。
- PyQt6:
pip install PyQt6 - Conda: 已安装 Anaconda 或 Miniconda,并且
conda命令已添加到系统的环境变量 (PATH) 中,可以在命令行中直接调用。
直接下载已经打包好的exe文件即可,或者克隆本仓库。
- 选择脚本:点击 "Python 脚本" 右侧的 "浏览..." 按钮,选择您想要打包的主 Python 文件。程序名称通常会自动根据文件名填充。
- 选择环境:在 "Conda 环境" 下拉菜单中,选择您的项目所使用的虚拟环境。选择后,相关的模块路径会自动填充。
- 自定义选项:
- 根据需要修改程序名称或添加图标。
- 选择打包模式(单文件或单目录)。
- 在 "高级打包选项" 中添加额外的数据文件或需要强制包含的库。
- 预览命令:在右侧的 "最终命令预览" 窗口中检查即将执行的命令是否符合预期。
- 开始构建:点击右下角的 "开始构建" 按钮。
- 查看日志:在 "构建日志" 窗口中观察实时输出。
- 完成:
- 如果构建成功,日志中会以绿色字体显示成功信息,并且 "打开目录" 按钮会变为可用状态。
- 如果构建失败,日志中会以红色字体显示失败信息,您可以根据日志排查问题。
本项目采用了分层设计,将界面、逻辑和主程序分离,便于维护和扩展。
-
main.py程序主入口。负责创建 PyQt6 应用实例,初始化主窗口,并将界面 (
ui_components.py) 的信号与后台逻辑 (builder.py) 的槽函数连接起来。 -
ui_components.py界面层 (View)。包含
PyInstallerGUI类,使用 PyQt6 负责所有UI控件的创建、布局、样式和主题切换。它只处理界面的显示和用户交互,不包含任何耗时的业务逻辑。 -
builder.py逻辑层 (Controller/Worker)。包含
BuildWorker类,它继承自QObject并在一个独立的QThread中运行。所有耗时操作(如执行 PyInstaller 命令)都在这里完成,并通过 PyQt 的信号机制与UI层进行安全的通信,从而避免界面冻结。
