如何修复_Tkinter.TclError:无法打开PNG?



我是python的新手,一直在摆弄Tkinter和PyInstaller。

当我使用打包脚本时;

pyinstaller --onefile --noconsole window.py  

并尝试打开它,我得到了这个错误;

Traceback (most recent call last):
File "window.py", line 10, in <module>
File "tkinter__init__.py", line 4093, in __init__
File "tkinter__init__.py", line 4038, in __init__
_tkinter.TclError: couldn't open "orange.png": no such file or directory

也许我遗漏了什么,
这是我的代码;

import tkinter as tk
from tkinter import PhotoImage
casement = tk.Tk() # Window
casement.title('Squeeze') # Window Title
casement.geometry('800x800') # Window Size
casement.resizable(True, True) # Winow Resizable x, y
casement.configure(bg='white') # Window Background Color
icon=PhotoImage(file="orange.png") # Window Icon File Var
casement.iconphoto(True,icon) # Window Icon
icon = tk.PhotoImage(file='orange.png') # Button Icon
button = tk.Button(casement, image=icon, text="Open Image", compound=tk.LEFT, bg='orange') # Button
button.pack(ipadx=5, ipady=5) #Button Placement
casement.mainloop()

当您使用Pyinstaller创建单个可执行文件时,它将把资源放在专门创建的"MEI";目录(名为"_MEI1234"(。当您运行构建命令时,您需要告诉Pyinstaller在哪里查找资产,如下所示:

pyinstaller -w -F -i ".srcassetsiconsappicon.ico" "<your filename.py here>" --add-data ".srcassets;assets"

通过这种方式,Pyinstaller理解它需要包括源资产文件夹中的所有内容(在我的示例中为srcassets,但您的示例可能不同(。然后,assets文件夹中的所有内容都将包含在可执行文件使用的MEI目录中。

要在Python应用程序以exe形式运行时访问这些资源,可以检索sys._MEIPASS并将其预先发送到资源路径。我在下面整理了一个函数来处理这个问题!

import sys
from pathlib import Path

def fetch_resource(rsrc_path):
try:
base_path = sys._MEIPASS
except AttributeError:  # running as script, return unmodified path
return rsrc_path  
else:  # running as exe, return MEI path
return base_path.joinpath(rsrc_path)

然后,对于任何外部资产,您都可以通过调用fetch_resource()来检索它们,就像这个一样

icon = PhotoImage(file=fetch_resource("my_assets/orange.png"))

只要确保包含my_assets/orange.png的任何根目录都通过--add-data ".my_source_code_dirmy_assets;my_assets"包含在构建中(同样,使用适合您特定项目的任何路径名(

最新更新