写好的 Python 脚本、桌面软件、自动化工具,想发给朋友直接用?不想让对方装 Python 环境? 下载exe链接在最后面




今天给大家推荐Python 打包界的「全能王者」—— PyInstaller!
它完全满足你的所有需求: ✅ 支持 PyQt/Tkinter/Flask/Selenium/OpenCV 几乎所有 Python 库 ✅ 打包命令超简单,一行代码搞定 ✅ 生态成熟,遇到问题全网都有解决方案 ✅ 单文件 exe、无控制台窗口、自定义图标全覆盖 ✅ 32/64 位、全版本 Windows 兼容拉满 ✅ 支持压缩打包,体积更小、启动更快
不管是打包小脚本、桌面软件、Web 小工具、自动化程序,它都是首选!
在 Python 打包工具里,PyInstaller 是综合评分第一、使用最广泛、最稳定的工具,没有之一。
全库兼容不管是 GUI 框架(PyQt5/PySide2/Tkinter)、Web 框架(Flask/Django)、自动化(Selenium/Playwright)、图像处理(OpenCV/PIL)、数据分析(Pandas/Numpy),全部完美支持,不用额外折腾适配。
打包命令极简不用写复杂配置,一行命令直接生成 exe,新手零门槛。
生态成熟、问题好解决发布 10+ 年,用户量上亿,你遇到的 99% 问题,网上都有现成答案,完全不用踩坑。
功能全覆盖✔ 单文件 exe(-F):只生成一个文件,发送超方便 ✔ 无控制台窗口(-w):做桌面软件不弹黑框 ✔ 自定义图标(-i):给软件换上专属 logo ✔ 压缩打包:减小文件体积 ✔ 32/64 位自动适配,Windows 全版本兼容
用途广泛快速打包小工具、桌面软件、自动化脚本、后台服务,全都能用!
打开命令提示符(CMD) 或 PowerShell,输入一行命令即可安装:
pip install pyinstaller
国内用户可以用清华镜像加速:
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
这是万能打包模板,适配 99% 的场景:
pyinstaller -F -w -i 图标.ico 你的代码.py
-F:打包成单个独立 exe 文件(最常用!)-w:无控制台黑窗口(做桌面软件必加,脚本/控制台程序不加)-i 图标.ico:自定义软件图标(必须是 .ico 格式)pyinstaller -F -w -i logo.ico main.py
pyinstaller -F test.py
pyinstaller -F -w --noconsole --onefile --clean main.py
执行命令后,会在代码同级目录生成 3 个文件夹:
build:临时文件(可删除)dist:最终 exe 文件就在这里xxx.spec:配置文件(可删,也可用来高级配置)直接打开 dist 文件夹,双击 exe 就能运行! 不用装 Python,不用装任何库,Windows 电脑直接用。
它能打包的 Python 程序,覆盖你所有开发场景: ✅ 桌面 GUI:PyQt5、PySide2、Tkinter、CustomTkinter ✅ Web 服务:Flask、Django、FastAPI ✅ 自动化爬虫:Selenium、Playwright、Requests ✅ 图像处理:OpenCV、Pillow、Matplotlib ✅ 数据分析:Pandas、Numpy、Scipy ✅ AI/深度学习:TensorFlow、PyTorch(需简单配置) ✅ 系统小工具:所有 Python 脚本、后台服务
真正做到:一次学会,全场景通用!
网上搜「png 转 ico」,在线工具一键转换,直接用 -i 加载即可。
upx 压缩(下载 upx.exe 放到 Python 目录,打包自动压缩)只有 PyInstaller:简单、稳定、全能、问题好解决,是普通人的最佳选择。
PyInstaller 是 Python 打包的终极解决方案: ✔ 一行命令打包,小白轻松上手 ✔ 支持所有 Python 库,全场景通吃 ✔ 单文件、无黑框、自定义图标全覆盖 ✔ Windows 32/64 位完美兼容 ✔ 生态成熟,问题全网可解
不管你是学生、职场人、开发者,只要需要把 Python 代码变成 exe,直接用 PyInstaller 就对了!
下面给你一套全新改版、功能更完善、界面更美观的 Python 打包工具完整版,使用 ttkbootstrap 现代风格UI,功能增强:
pip install pyinstaller ttkbootstrap
import os
import sys
import subprocess
import threading
from pathlib import Path
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from tkinter import (
filedialog, messagebox,
BooleanVar, StringVar, END
)
classPyExePacker:
def__init__(self, root):
self.root = root
self.root.title("Python EXE 打包工具 v2.0 - 美化增强版")
self.root.geometry("860x640")
self.root.resizable(False, False)
self.root.place_window_center()
# ========== 变量 ==========
self.py_path = StringVar()
self.icon_path = StringVar()
self.out_dir = StringVar(value=str(Path.cwd()))
self.mode_onefile = BooleanVar(value=True)
self.mode_nowindow = BooleanVar(value=False)
self.mode_admin = BooleanVar(value=False)
self.mode_clean = BooleanVar(value=True)
self.mode_upx = BooleanVar(value=False)
self.mode_noconsole = BooleanVar(value=False)
# ========== 主体框架 ==========
self.notebook = ttk.Notebook(root)
self.notebook.pack(fill=BOTH, expand=YES, padx=10, pady=10)
# 打包页面
self.frame_pack = ttk.Frame(self.notebook, padding=15)
self.notebook.add(self.frame_pack, text="📦 打包工具")
# 引导页面
self.frame_about = ttk.Frame(self.notebook, padding=20)
self.notebook.add(self.frame_about, text="ℹ️ 关于作者")
self.build_ui_pack()
self.build_ui_about()
# ==================== 打包页面UI ====================
defbuild_ui_pack(self):
# ========== 文件选择 ==========
ttk.Label(self.frame_pack, text="Python 脚本:", font=("", 11, "bold")).grid(row=0, column=0, sticky=W, pady=8)
ttk.Entry(self.frame_pack, textvariable=self.py_path, width=58).grid(row=0, column=1, padx=5, pady=8)
ttk.Button(self.frame_pack, text="选择文件", command=self.select_py, bootstyle="info-outline").grid(row=0, column=2, padx=2)
# ========== 图标 ==========
ttk.Label(self.frame_pack, text="自定义图标:", font=("", 11, "bold")).grid(row=1, column=0, sticky=W, pady=8)
ttk.Entry(self.frame_pack, textvariable=self.icon_path, width=58).grid(row=1, column=1, padx=5, pady=8)
ttk.Button(self.frame_pack, text="选择ICO", command=self.select_ico, bootstyle="info-outline").grid(row=1, column=2, padx=2)
# ========== 输出目录 ==========
ttk.Label(self.frame_pack, text="输出目录:", font=("", 11, "bold")).grid(row=2, column=0, sticky=W, pady=8)
ttk.Entry(self.frame_pack, textvariable=self.out_dir, width=58).grid(row=2, column=1, padx=5, pady=8)
ttk.Button(self.frame_pack, text="选择目录", command=self.select_out, bootstyle="info-outline").grid(row=2, column=2, padx=2)
# ========== 选项组 ==========
group = ttk.LabelFrame(self.frame_pack, text="打包选项", padding=12)
group.grid(row=3, column=0, columnspan=3, sticky=EW, pady=10)
ttk.Checkbutton(group, text="单文件EXE (-F)", variable=self.mode_onefile).grid(row=0, column=0, padx=10, pady=4, sticky=W)
ttk.Checkbutton(group, text="无控制台窗口 (-w)", variable=self.mode_nowindow).grid(row=0, column=1, padx=10, pady=4, sticky=W)
ttk.Checkbutton(group, text="管理员权限运行", variable=self.mode_admin).grid(row=0, column=2, padx=10, pady=4, sticky=W)
ttk.Checkbutton(group, text="自动清理临时文件", variable=self.mode_clean).grid(row=1, column=0, padx=10, pady=4, sticky=W)
ttk.Checkbutton(group, text="UPX压缩(需自行放upx.exe)", variable=self.mode_upx).grid(row=1, column=1, padx=10, pady=4, sticky=W)
# ========== 按钮组 ==========
btn_frame = ttk.Frame(self.frame_pack)
btn_frame.grid(row=4, column=0, columnspan=3, pady=12)
self.btn_start = ttk.Button(btn_frame, text="🚀 开始打包", command=self.start_pack_thread, bootstyle="primary", width=18)
self.btn_start.pack(side=LEFT, padx=8)
ttk.Button(btn_frame, text="📂 打开输出目录", command=self.open_dist, bootstyle="success-outline", width=14).pack(side=LEFT, padx=8)
ttk.Button(btn_frame, text="🧹 清空日志", command=self.clear_log, bootstyle="light", width=12).pack(side=LEFT, padx=8)
# ========== 日志区域 ==========
ttk.Separator(self.frame_pack).grid(row=5, column=0, columnspan=3, sticky=EW, pady=8)
ttk.Label(self.frame_pack, text="打包日志", font=("", 11, "bold")).grid(row=6, column=0, columnspan=3, sticky=W)
self.log_text = ttk.ScrolledText(self.frame_pack, height=22, font=("Consolas", 9))
self.log_text.grid(row=7, column=0, columnspan=3, sticky=NSEW, pady=5)
self.log_text.configure(yscrollcommand=lambda *args: None)
# ==================== 关于页面UI ====================
defbuild_ui_about(self):
frame = ttk.Frame(self.frame_about)
frame.pack(expand=YES, fill=BOTH, pady=40)
ttk.Label(frame, text="Python EXE 打包工具", font=("", 20, "bold"), bootstyle="primary").pack(pady=10)
ttk.Label(frame, text="支持 PyQt / Tkinter / Flask / Selenium / OpenCV 全库兼容", font=("", 11)).pack(pady=5)
ttk.Separator(frame).pack(fill=X, pady=20, padx=50)
info_list = [
"公众号:Python学在坚持",
"联系人:杨少平",
"电话:17353994769",
"微信号:ysp2338084"
]
for txt in info_list:
ttk.Label(frame, text=txt, font=("", 14, "bold")).pack(pady=8)
ttk.Separator(frame).pack(fill=X, pady=20, padx=50)
ttk.Label(frame, text="© 2026 版权所有 禁止倒卖", font=("", 10), bootstyle="secondary").pack(pady=5)
# ==================== 功能方法 ====================
deflog(self, msg):
self.log_text.insert(END, msg + "\n")
self.log_text.see(END)
self.root.update_idletasks()
defclear_log(self):
self.log_text.delete(1.0, END)
defselect_py(self):
p = filedialog.askopenfilename(filetypes=[("Python文件", "*.py"), ("所有文件", "*.*")])
if p: self.py_path.set(p)
defselect_ico(self):
p = filedialog.askopenfilename(filetypes=[("图标文件", "*.ico"), ("所有文件", "*.*")])
if p: self.icon_path.set(p)
defselect_out(self):
p = filedialog.askdirectory()
if p: self.out_dir.set(p)
defopen_dist(self):
try: os.startfile(self.out_dir.get())
except: messagebox.showerror("错误", "无法打开目录")
# ==================== 打包核心 ====================
defstart_pack_thread(self):
threading.Thread(target=self.start_pack, daemon=True).start()
defstart_pack(self):
py = self.py_path.get().strip()
ifnot py ornot py.endswith(".py"):
messagebox.showerror("错误", "请选择有效的 Python 脚本")
return
self.btn_start.config(state="disabled", text="打包中...")
self.clear_log()
self.log("="*70)
self.log("🔥 开始打包 EXE,请稍候...")
self.log(f"📄 脚本:{os.path.basename(py)}")
self.log(f"📂 输出:{self.out_dir.get()}")
self.log("="*70)
cmd = [sys.executable, "-m", "PyInstaller"]
if self.mode_onefile.get(): cmd.append("-F")
if self.mode_nowindow.get(): cmd.append("-w")
if self.mode_clean.get(): cmd.append("--clean")
icon = self.icon_path.get().strip()
if icon and icon.endswith(".ico"):
cmd.extend(["-i", icon])
if self.mode_admin.get():
cmd.append("--uac-admin")
cmd.extend(["--distpath", self.out_dir.get()])
cmd.append(py)
try:
self.log(f"✅ 执行命令:{' '.join(cmd)}")
self.log("-"*70)
proc = subprocess.Popen(
cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
text=True, encoding="utf-8", errors="replace"
)
for line in iter(proc.stdout.readline, ""):
if line.strip(): self.log(line.strip())
proc.wait()
if proc.returncode == 0:
self.log("✅ 打包成功!EXE 已在输出目录")
messagebox.showinfo("完成", "打包成功!")
else:
self.log("❌ 打包失败")
messagebox.showerror("失败", "打包过程出错,查看日志")
except Exception as e:
self.log(f"❌ 异常:{str(e)}")
messagebox.showerror("错误", f"执行失败:{e}")
finally:
self.btn_start.config(state="normal", text="🚀 开始打包")
self.log("="*70)
if __name__ == "__main__":
app = ttk.Window(themename="cosmo") # 可选:cosmo / flatly / lumen / darkly
PyExePacker(app)
app.mainloop()
✅ 现代美观 UI(ttkbootstrap 主题) ✅ 单文件、无控制台、管理员权限 ✅ 自定义输出目录、自动清理 ✅ UPX 压缩支持(需自行放 upx.exe) ✅ 实时日志、滚动条、清空日志 ✅ 一键打开输出目录 ✅ 多线程不卡顿 ✅ 版本信息、版权、引导页完整 ✅ 编码不乱码、异常更稳定 ✅ 窗口居中、禁止拉伸、体验更好
pyinstaller -F -w -i logo.ico 你的文件名.py
给你升级成 8 套精美主题: 浅色 / 深色 / 蓝色 / 暗黑绿 / 紫罗兰 / 粉色少女 / 灰色商务 / 暗夜黑金 全部内置切换,界面更炫酷、更专业,代码依然完整可直接运行。
import sys
import os
import subprocess
import threading
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QFont
from PyQt5.QtCore import Qt, QThread, pyqtSignal
classPackThread(QThread):
log_signal = pyqtSignal(str)
finished_signal = pyqtSignal(int)
def__init__(self, cmd):
super().__init__()
self.cmd = cmd
defrun(self):
try:
process = subprocess.Popen(
self.cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
text=True, encoding="utf-8", errors="replace"
)
for line in iter(process.stdout.readline, ""):
if line.strip():
self.log_signal.emit(line.strip())
process.wait()
self.finished_signal.emit(process.returncode)
except Exception as e:
self.log_signal.emit(f"错误:{str(e)}")
self.finished_signal.emit(-1)
classPyExePacker(QMainWindow):
def__init__(self):
super().__init__()
self.setWindowTitle("Python EXE 打包工具 v5.0 | 多主题专业版")
self.setFixedSize(920, 700)
self.version = "v5.0"
self.copyright = "© 2026 Python学在坚持 版权所有"
self.init_ui()
self.apply_theme("浅色主题")
definit_ui(self):
central = QWidget()
self.setCentralWidget(central)
layout = QVBoxLayout(central)
layout.setContentsMargins(20, 20, 20, 20)
layout.setSpacing(12)
# 顶部版本 + 主题切换
top_layout = QHBoxLayout()
self.label_version = QLabel(f"版本:{self.version} | {self.copyright}")
self.theme_combo = QComboBox()
self.theme_combo.addItems([
"浅色主题",
"深色主题",
"蓝色主题",
"暗黑绿主题",
"紫罗兰主题",
"粉色少女主题",
"灰色商务主题",
"暗夜黑金主题"
])
self.theme_combo.currentTextChanged.connect(self.change_theme)
top_layout.addWidget(self.label_version)
top_layout.addStretch()
top_layout.addWidget(QLabel("切换主题:"))
top_layout.addWidget(self.theme_combo)
layout.addLayout(top_layout)
# 标签页
self.tab = QTabWidget()
self.tab.setFont(QFont("Microsoft YaHei", 10))
layout.addWidget(self.tab)
# 打包页面
self.pack_tab = QWidget()
self.tab.addTab(self.pack_tab, "📦 打包工具")
self.create_pack_ui()
# 关于页面
self.about_tab = QWidget()
self.tab.addTab(self.about_tab, "ℹ️ 关于我们")
self.create_about_ui()
defcreate_pack_ui(self):
layout = QFormLayout(self.pack_tab)
layout.setSpacing(14)
# 脚本路径
self.py_path_edit = QLineEdit()
self.py_path_edit.setPlaceholderText("选择要打包的 .py 文件")
py_btn = QPushButton("浏览文件")
py_btn.clicked.connect(self.select_py)
py_layout = QHBoxLayout()
py_layout.addWidget(self.py_path_edit)
py_layout.addWidget(py_btn)
layout.addRow("Python 脚本:", py_layout)
# 图标
self.icon_edit = QLineEdit()
self.icon_edit.setPlaceholderText("可选:选择 .ico 图标")
icon_btn = QPushButton("选择图标")
icon_btn.clicked.connect(self.select_icon)
icon_layout = QHBoxLayout()
icon_layout.addWidget(self.icon_edit)
icon_layout.addWidget(icon_btn)
layout.addRow("自定义图标:", icon_layout)
# 输出目录
self.out_edit = QLineEdit(os.getcwd())
out_btn = QPushButton("选择目录")
out_btn.clicked.connect(self.select_out)
out_layout = QHBoxLayout()
out_layout.addWidget(self.out_edit)
out_layout.addWidget(out_btn)
layout.addRow("输出目录:", out_layout)
# 选项
self.opt_onefile = QCheckBox("单文件 EXE (-F)")
self.opt_nowindow = QCheckBox("无控制台窗口 (-w)")
self.opt_clean = QCheckBox("自动清理临时文件")
self.opt_admin = QCheckBox("管理员权限运行")
self.opt_onefile.setChecked(True)
self.opt_clean.setChecked(True)
opt_layout = QGridLayout()
opt_layout.addWidget(self.opt_onefile, 0, 0)
opt_layout.addWidget(self.opt_nowindow, 0, 1)
opt_layout.addWidget(self.opt_clean, 1, 0)
opt_layout.addWidget(self.opt_admin, 1, 1)
layout.addRow("打包选项:", opt_layout)
# 按钮
btn_layout = QHBoxLayout()
self.start_btn = QPushButton("🚀 开始打包")
self.start_btn.clicked.connect(self.start_pack)
self.open_dir_btn = QPushButton("📂 打开输出目录")
self.open_dir_btn.clicked.connect(self.open_out_dir)
self.clear_log_btn = QPushButton("🧹 清空日志")
self.clear_log_btn.clicked.connect(self.clear_log)
btn_layout.addWidget(self.start_btn)
btn_layout.addWidget(self.open_dir_btn)
btn_layout.addWidget(self.clear_log_btn)
layout.addRow("", btn_layout)
# 日志
layout.addRow("打包日志:", QLabel())
self.log_text = QTextEdit()
self.log_text.setReadOnly(True)
self.log_text.setFont(QFont("Consolas", 10))
layout.addRow(self.log_text)
defcreate_about_ui(self):
layout = QVBoxLayout(self.about_tab)
layout.setAlignment(Qt.AlignCenter)
layout.setSpacing(16)
title = QLabel("Python EXE 打包工具")
title.setFont(QFont("Microsoft YaHei", 22, QFont.Bold))
layout.addWidget(title, alignment=Qt.AlignHCenter)
version = QLabel(f"版本 {self.version} | 全库兼容 | 稳定高效 | 多主题")
version.setFont(QFont("", 12))
layout.addWidget(version, alignment=Qt.AlignHCenter)
line = QFrame()
line.setFrameShape(QFrame.HLine)
layout.addWidget(line)
info = [
"公众号:Python学在坚持",
"联系人:杨少平",
"电话:17353994769",
"微信号:ysp2338084"
]
for text in info:
label = QLabel(text)
label.setFont(QFont("", 14, QFont.Bold))
layout.addWidget(label, alignment=Qt.AlignHCenter)
layout.addStretch()
copyright_label = QLabel(self.copyright)
copyright_label.setStyleSheet("color: #666; font-size:12px;")
layout.addWidget(copyright_label, alignment=Qt.AlignHCenter)
# ================== 功能 ==================
deflog(self, msg):
self.log_text.append(msg)
self.log_text.verticalScrollBar().setValue(self.log_text.verticalScrollBar().maximum())
defclear_log(self):
self.log_text.clear()
defselect_py(self):
path, _ = QFileDialog.getOpenFileName(filter="Python Files (*.py)")
if path:
self.py_path_edit.setText(path)
defselect_icon(self):
path, _ = QFileDialog.getOpenFileName(filter="Icon Files (*.ico)")
if path:
self.icon_edit.setText(path)
defselect_out(self):
path = QFileDialog.getExistingDirectory()
if path:
self.out_edit.setText(path)
defopen_out_dir(self):
try:
os.startfile(self.out_edit.text())
except:
QMessageBox.warning(self, "提示", "目录不存在")
defstart_pack(self):
py_path = self.py_path_edit.text().strip()
ifnot py_path.endswith(".py") ornot os.path.exists(py_path):
QMessageBox.critical(self, "错误", "请选择有效的 Python 脚本")
return
self.start_btn.setEnabled(False)
self.start_btn.setText("打包中...")
self.clear_log()
self.log("=" * 60)
self.log("🔥 开始打包...")
cmd = [sys.executable, "-m", "pyinstaller"]
if self.opt_onefile.isChecked():
cmd.append("-F")
if self.opt_nowindow.isChecked():
cmd.append("-w")
if self.opt_clean.isChecked():
cmd.append("--clean")
if self.opt_admin.isChecked():
cmd.append("--uac-admin")
icon = self.icon_edit.text().strip()
if icon and icon.endswith(".ico"):
cmd.extend(["-i", icon])
cmd.extend(["--distpath", self.out_edit.text()])
cmd.append(py_path)
self.log(f"执行命令:{' '.join(cmd)}")
self.log("-" * 60)
self.thread = PackThread(cmd)
self.thread.log_signal.connect(self.log)
self.thread.finished_signal.connect(self.pack_finished)
self.thread.start()
defpack_finished(self, code):
self.start_btn.setEnabled(True)
self.start_btn.setText("🚀 开始打包")
if code == 0:
self.log("✅ 打包成功!")
QMessageBox.information(self, "完成", "✅ 打包成功!\n文件已保存到输出目录")
else:
self.log("❌ 打包失败")
QMessageBox.critical(self, "失败", "打包过程出现错误")
# ================== 8套主题切换 ==================
defchange_theme(self, name):
theme_map = {
"浅色主题": "light",
"深色主题": "dark",
"蓝色主题": "blue",
"暗黑绿主题": "green",
"紫罗兰主题": "purple",
"粉色少女主题": "pink",
"灰色商务主题": "gray",
"暗夜黑金主题": "black_gold"
}
self.apply_theme(theme_map.get(name, "light"))
defapply_theme(self, mode):
if mode == "dark":
self.setStyleSheet("""
QMainWindow{background:#1e1e2e;}
QTabWidget::pane{background:#252535; border:1px solid #444;}
QTabBar::tab{background:#2b2b3b; color:#eee; padding:8px 14px;}
QTabBar::tab:selected{background:#5c5c8c; color:white;}
QLabel{color:#e0e0e0;}
QLineEdit, QTextEdit, QComboBox{background:#2a2a3a; color:white; border:1px solid #555; padding:5px;}
QPushButton{background:#5c5c8c; color:white; padding:7px; border:none;}
QPushButton:hover{background:#6c6c9c;}
QCheckBox{color:#e0e0e0;}
""")
elif mode == "blue":
self.setStyleSheet("""
QMainWindow{background:#f0f8ff;}
QTabWidget::pane{background:#fff; border:1px solid #cce7ff;}
QTabBar::tab{background:#e6f7ff; color:#005aa0; padding:8px 14px;}
QTabBar::tab:selected{background:#40a9ff; color:white;}
QPushButton{background:#40a9ff; color:white; padding:7px; border:none;}
""")
elif mode == "green":
self.setStyleSheet("""
QMainWindow{background:#1b2624;}
QTabWidget::pane{background:#21312e; border:1px solid #3a5a4e;}
QTabBar::tab{background:#273935; color:#e0ebe8;}
QTabBar::tab:selected{background:#2ecc71; color:white;}
QLabel{color:#e0ebe8;}
QLineEdit,QTextEdit{background:#2a3d38; color:white; border:1px solid #3a5a4e;}
QPushButton{background:#27ae60; color:white; padding:7px;}
""")
elif mode == "purple":
self.setStyleSheet("""
QMainWindow{background:#241b2e;}
QTabWidget::pane{background:#2d1f3f; border:1px solid #5a4b72;}
QTabBar::tab{background:#392b4d; color:#f0eaff;}
QTabBar::tab:selected{background:#9b59b6; color:white;}
QLabel{color:#f0eaff;}
QLineEdit,QTextEdit{background:#3a2b4f; color:white;}
QPushButton{background:#8e44ad; color:white; padding:7px;}
""")
elif mode == "pink":
self.setStyleSheet("""
QMainWindow{background:#fff5f8;}
QTabWidget::pane{background:#fff; border:1px solid #fbcfe8;}
QTabBar::tab{background:#fce7f3; color:#831843;}
QTabBar::tab:selected{background:#ec4899; color:white;}
QPushButton{background:#db2777; color:white; padding:7px;}
""")
elif mode == "gray":
self.setStyleSheet("""
QMainWindow{background:#f5f7fa;}
QTabWidget::pane{background:#fff; border:1px solid #ddd;}
QTabBar::tab{background:#eee; color:#333;}
QTabBar::tab:selected{background:#64748b; color:white;}
QPushButton{background:#475569; color:white; padding:7px;}
""")
elif mode == "black_gold":
self.setStyleSheet("""
QMainWindow{background:#121212;}
QTabWidget::pane{background:#1a1a1a; border:1px solid #333;}
QTabBar::tab{background:#222; color:#f5e7b6;}
QTabBar::tab:selected{background:#d4af37; color:black; font-weight:bold;}
QLabel{color:#f5e7b6;}
QLineEdit,QTextEdit{background:#242424; color:#f5e7b6; border:1px solid #444;}
QPushButton{background:#d4af37; color:black; padding:7px; font-weight:bold;}
""")
else: # light
self.setStyleSheet("""
QMainWindow{background:#ffffff;}
QTabWidget::pane{background:#f8f8f8; border:1px solid #ddd;}
QTabBar::tab{background:#eee; padding:8px 14px;}
QTabBar::tab:selected{background:#0078d7; color:white;}
QPushButton{background:#0078d7; color:white; padding:7px; border:none;}
""")
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setFont(QFont("Microsoft YaHei", 10))
window = PyExePacker()
window.show()
sys.exit(app.exec_())
万能打包命令再次奉上,直接复制使用:
# 桌面软件(单文件+无黑框+自定义图标)
pyinstaller -F -w -i logo.ico main.py
# 控制台脚本(单文件)
pyinstaller -F main.py
赶紧去试试吧!有任何打包问题,评论区留言,我来帮你解决~
pyinstaller -F -w -i 图标.ico 代码.py,覆盖 99% 场景;通过网盘分享的文件:Python学在坚持打包EXE小工具.exe
链接: https://pan.baidu.com/s/19BFSogNprUaAPDZ9aaGxlg?pwd=1234 提取码: 1234
通过网盘分享的文件:Python学在坚持打包EXE小工具V5.exe
链接: https://pan.baidu.com/s/1Pj7HvvpOzMtGYmLs_q9ERQ?pwd=4444 提取码: 4444
