使用PyInstaller打包后Tkinter的Toplevel窗口图片无法显示如何解决?
解决方案
这个问题由两个常见原因导致,按以下步骤修改即可解决:
1. 修正资源路径读取逻辑
PyInstaller 打包为单文件(--onefile)运行时,会将所有资源解压到系统临时目录的随机文件夹下,你直接写相对路径en.png会从exe所在的工作目录读取文件,自然找不到打包进去的图片。
你需要在代码中新增路径适配函数,自动识别开发环境和打包后的运行环境:
import sys import os def resource_path(relative_path): try: # PyInstaller 运行时的临时资源目录 base_path = sys._MEIPASS except AttributeError: # 本地开发时的当前脚本目录 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path)
之后所有加载图片的地方,都用这个函数处理路径即可:
# 不管用原生Tkinter还是PIL加载,都用resource_path处理路径 from PIL import ImageTk, Image enimg = ImageTk.PhotoImage(Image.open(resource_path("en.png")))
2. 保留图片对象引用避免被垃圾回收
Tkinter 的PhotoImage对象如果是局部变量,会在函数运行结束后被Python垃圾回收,导致图片显示空白。你需要手动把图片对象绑定到对应的控件上保留引用:
enpanel = tk.Label(tutoriallevel, image=enimg) enpanel.image = enimg # 关键:手动保留图片引用 enpanel.pack()
验证方式
如果修改后还是有问题,可以暂时把PyInstaller命令里的--windowed参数去掉,打包成带控制台的版本运行,就能看到具体的报错信息,快速定位问题。你之前用的--add-data参数配置是正确的,不需要调整。
内容的提问来源于stack exchange,提问作者gioggino
相关产品推荐
相关产品推荐

