Python Tkinter 程序打包单文件 exe 完整教程(Base64 内嵌图标,解决窗口 / 任务栏 /exe 三处图标自定义,无资源缺失报错) 前言 前言使用tkinterpyinstaller打包GUI程序时会遇到3个典型痛点打包后exe文件夹图标、软件窗口左上角、任务栏图标全是默认软盘直接读取本地ico文件打包运行提示bitmap app.ico not defined崩溃单文件--onefile模式丢失DLL、解压失败闪退。本文采用Base64内嵌图标 spec配置文件打包方案一次性解决全部图标问题分发仅需单个exe无需附带任何图片资源。前置依赖开发环境Python3.11 虚拟环境venv项目依赖ttkbootstrap、openpyxl、pyttsx3、pywin32打包工具pyinstaller安装全部依赖命令pip install pyinstaller ttkbootstrap openpyxl pyttsx3 pywin32步骤1准备标准ICO图标文件图标规范必须是.ico格式内置多尺寸256/128/64/32/16px纯色简约图案避免渐变透明花屏在线转换工具convertio.co/png-to-ico上传图片导出全套尺寸ico项目目录新建img文件夹放入图标logo.ico目录结构your-app/ ├─ img/ │ └─ logo.ico ├─ core/ ├─ ui/ ├─ main.py └─ icoToBase64.py步骤2ICO转Base64脚本将图标编码存入Python文件新建icoToBase64.py作用把ico二进制转为base64字符串写入img/logo.py实现图标内置代码打包无需外置图片。importbase64# 读取ico二进制文件withopen(./img/logo.ico,rb)asf:icon_rawf.read()# 转换base64编码icon_b64base64.b64encode(icon_raw)# 写入img/logo.py存储图标编码withopen(./img/logo.py,w,encodingutf-8)asout_file:out_file.write(fimgBase64 {icon_b64}\n)运行脚本python icoToBase64.py执行后img目录生成logo.py图标永久内置代码不依赖外部文件。步骤3改造主程序main.py动态生成临时图标窗口任务栏图标3.1 完整main.py核心代码importbase64importosimportatexitimportttkbootstrapastb# 导入base64编码图标fromimg.logoimportimgBase64fromcore.data_storeimportload_all_cardsfromui.main_windowimportcreate_main_window# 全局临时图标路径temp_icon_pathdefcreate_temp_icon()-str:从base64解码生成系统临时ico文件globaltemp_icon_path# 生成临时ico可替换为tempfile存入系统缓存不残留文件temp_icon_pathtemp.icowithopen(temp_icon_path,wb)asf:f.write(base64.b64decode(imgBase64))returntemp_icon_pathdefclean_temp_icon():程序退出自动删除临时ico兜底捕获异常globaltemp_icon_pathifos.path.exists(temp_icon_path):try:os.remove(temp_icon_path)exceptException:passdefmain():# 1. 生成临时图标create_temp_icon()# 注册程序退出钩子无论正常关闭/闪退都清理临时文件atexit.register(clean_temp_icon)# 2. 创建主窗口roottb.Window(themenameflatly)root.title(我的应用)root.geometry(710x550)root.resizable(True,True)# 3. 设置窗口左上角、任务栏图标root.wm_iconbitmap(temp_icon_path)# 绑定窗口关闭事件defclose_window():clean_temp_icon()root.destroy()root.protocol(WM_DELETE_WINDOW,close_window)# 业务逻辑初始化all_word_listload_all_cards()create_main_window(root,all_word_list)root.mainloop()if__name____main__:main()优化升级可选彻底消除exe目录残留temp.ico使用系统临时文件夹存放ico不会在exe同级生成文件替换create_temp_icon函数importtempfiledefcreate_temp_icon()-str:globaltemp_icon_path tmptempfile.NamedTemporaryFile(suffix.ico,deleteFalse)tmp.write(base64.b64decode(imgBase64))tmp.close()temp_icon_pathtmp.namereturntemp_icon_path步骤4生成修改PyInstaller打包配置spec文件4.1 生成spec模板终端执行命令自动创建main.spec配置文件pyi-makespec--onefile--windowed main.py参数说明--onefile打包为单exe文件--windowed无黑色控制台窗口。4.2 修改spec自定义exe文件图标文件夹显示图标打开main.spec找到底部EXE配置块修改icon参数指定ico路径exeEXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,[],name我的应用,# 打包后exe文件名debugFalse,bootloader_ignore_signalsFalse,stripFalse,upxTrue,upx_exclude[],runtime_tmpdirNone,consoleFalse,# 关闭黑窗口和--windowed等价disable_windowed_tracebackFalse,argv_emulationFalse,target_archNone,codesign_identityNone,entitlements_fileNone,icon./img/logo.ico# 打包嵌入exe文件图标)注意icon路径是打包时读取本地项目必须存在img/logo.ico仅用于修改exe二进制资源不参与程序运行。步骤5执行打包命令生成exe5.1 清理旧缓存必做解决图标缓存不刷新手动删除项目内3个文件/文件夹build、dist、main.spec重新生成全新spec5.2 执行spec打包pyinstaller main.spec5.3 打包完成产物项目根目录生成dist文件夹内部我的应用.exe为最终成品单文件程序。最终效果说明exe文件夹图标spec配置icon参数控制分发到任意电脑都显示自定义图标软件窗口左上角图标Base64动态生成临时ico渲染Windows任务栏图标跟随tkinter窗口图标自动同步分发仅需单个exe无需附带图片、json资源全部内置代码/打包二进制。拓展文件夹打包模式兼容性最强推荐复杂项目若项目依赖pyttsx3语音、openpyxl表格库单文件极易闪退去掉--onefile打包生成spec命令pyi-makespec --windowed main.py打包后dist为完整文件夹整体分发无DLL缺失、解压失败问题。