使用说明:
1.选择 .py
文件:选择要打包的 Python 脚本文件。
2.选择图标文件:支持 .ico
, .png
, .jpg
, .jpeg
, .bmp
, .gif
等格式,但 PyInstaller 只能直接使用 .ico
格式的图标。其他格式会自动转换。
3.选择输出目录:选择打包后 .exe
文件的保存目录。
4.开始打包:成功或失败后都会弹出相应的提示框。
依赖项:
Python 3.x
tkinter
(Python 自带)
PyInstaller
(可以通过 pip install pyinstaller
安装)
成品:
优化:
为了在打包过程中避免显示命令行的黑色窗口,可以在使用 PyInstaller
时添加 --noconsole
选项。此选项会将应用程序打包为一个 Windows GUI 应用程序,而不是控制台应用程序。
下面是优化后的代码,包含在使用 PyInstaller
时添加 --noconsole
选项,以确保打包后的可执行文件不会显示命令行窗口。
import os
import subprocess
import tkinter as tk
from tkinter import filedialog, messagebox
def select_py_file():
py_file_path.set(filedialog.askopenfilename(filetypes=[("Python 文件", "*.py")]))
def select_icon_file():
icon_file_path.set(filedialog.askopenfilename(filetypes=[("图标文件", "*.ico *.png *.jpg *.jpeg *.bmp *.gif")]))
def select_output_dir():
output_dir_path.set(filedialog.askdirectory())
def start_packing():
py_file = py_file_path.get()
icon_file = icon_file_path.get()
output_dir = output_dir_path.get()
if not py_file:
messagebox.showwarning("警告", "请选择一个 .py 文件。")
return
if not output_dir:
messagebox.showwarning("警告", "请选择导出目录。")
return
try:
# 使用 PyInstaller 打包命令
cmd = [
"pyinstaller",
"--onefile",
"--noconsole", # 不显示命令行窗口
"--distpath", output_dir,
py_file
]
if icon_file:
cmd.extend(["--icon", icon_file])
# 执行打包命令
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
messagebox.showinfo("成功", "打包成功!")
else:
messagebox.showerror("错误", f"打包失败!\n{result.stderr}")
except Exception as e:
messagebox.showerror("错误", f"发生错误:\n{e}")
# GUI 主窗口
root = tk.Tk()
root.title("Python 转 EXE 打包器")
root.geometry("530x220") # 增加窗口宽度
# 文件路径变量
py_file_path = tk.StringVar()
icon_file_path = tk.StringVar()
output_dir_path = tk.StringVar()
# GUI 组件
tk.Label(root, text="选择 .py 文件:").grid(row=0, column=0, padx=10, pady=10, sticky="e")
tk.Entry(root, textvariable=py_file_path, width=50).grid(row=0, column=1, pady=10)
tk.Button(root, text="浏览", command=select_py_file).grid(row=0, column=2, padx=10, pady=10)
tk.Label(root, text="选择图标文件:").grid(row=1, column=0, padx=10, pady=10, sticky="e")
tk.Entry(root, textvariable=icon_file_path, width=50).grid(row=1, column=1, pady=10)
tk.Button(root, text="浏览", command=select_icon_file).grid(row=1, column=2, padx=10, pady=10)
tk.Label(root, text="选择导出目录:").grid(row=2, column=0, padx=10, pady=10, sticky="e")
tk.Entry(root, textvariable=output_dir_path, width=50).grid(row=2, column=1, pady=10)
tk.Button(root, text="浏览", command=select_output_dir).grid(row=2, column=2, padx=10, pady=10)
tk.Button(root, text="开始打包", command=start_packing).grid(row=3, column=1, pady=20)
# 运行主窗口
root.mainloop()