You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决_Tkinter.TclError:无法打开PNG文件的问题?

解决PyInstaller打包Tkinter程序找不到图片文件的问题

问题原因

使用--onefile参数打包时,PyInstaller会将所有资源解压到系统临时目录,而非你运行exe的当前目录。代码中使用相对路径"orange.png"会在当前exe目录查找,导致找不到文件。

解决方案1:修改代码获取正确资源路径(推荐)

步骤1:修改代码,添加资源路径获取函数

修改你的window.py代码,加入路径处理逻辑:

import tkinter as tk
from tkinter import PhotoImage
import sys
import os

def get_resource_path(relative_path):
    try:
        # 打包后获取临时目录路径
        base_path = sys._MEIPASS
    except Exception:
        # 未打包时使用当前工作目录
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

casement = tk.Tk()
casement.title('Squeeze')
casement.geometry('800x800')
casement.resizable(True, True)
casement.configure(bg='white')

# 使用函数获取图片路径
icon_path = get_resource_path("orange.png")
window_icon = PhotoImage(file=icon_path)
casement.iconphoto(True, window_icon)

btn_icon = PhotoImage(file=icon_path)
button = tk.Button(casement, image=btn_icon, text="Open Image", compound=tk.LEFT, bg='orange')
button.pack(ipadx=5, ipady=5)

casement.mainloop()

步骤2:打包时指定资源文件

使用--add-data参数告诉PyInstaller包含图片文件:

  • Windows系统:
pyinstaller --onefile --noconsole --add-data "orange.png;." window.py
  • Linux/macOS系统:
pyinstaller --onefile --noconsole --add-data "orange.png:." window.py

解决方案2:使用.spec文件打包

步骤1:生成.spec文件

先执行命令生成基础的.spec文件:

pyinstaller --onefile --noconsole window.py

步骤2:编辑.spec文件

打开生成的window.spec,找到datas参数,添加图片文件配置:

a = Analysis(
    ['window.py'],
    pathex=[],
    binaries=[],
    # 添加这一行,指定要打包的资源文件
    datas=[('orange.png', '.')],
    ...
)

步骤3:用.spec文件打包

执行命令完成打包:

pyinstaller window.spec

解决方案3:将图片嵌入代码(无需额外携带图片)

把图片转成base64字符串嵌入代码,彻底避免路径问题:

步骤1:生成图片的base64字符串

运行以下脚本,生成orange.png的base64编码:

import base64

with open("orange.png", "rb") as img_file:
    base64_str = base64.b64encode(img_file.read()).decode("utf-8")
print(f"img_base64 = '{base64_str}'")

步骤2:修改代码嵌入base64字符串

将生成的base64字符串替换到以下代码中:

import tkinter as tk
from tkinter import PhotoImage
import base64
from io import BytesIO

# 替换成你生成的base64字符串
img_base64 = '这里替换为orange.png的base64编码'

# 将base64字符串转回图片对象
img_data = base64.b64decode(img_base64)
img = PhotoImage(data=img_data)

casement = tk.Tk()
casement.title('Squeeze')
casement.geometry('800x800')
casement.resizable(True, True)
casement.configure(bg='white')

casement.iconphoto(True, img)
button = tk.Button(casement, image=img, text="Open Image", compound=tk.LEFT, bg='orange')
button.pack(ipadx=5, ipady=5)

casement.mainloop()

步骤3:打包

直接使用原命令打包即可,无需额外参数:

pyinstaller --onefile --noconsole window.py

内容的提问来源于stack exchange,提问作者emptybrother7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:46:15