我使用 pyinstaller 从我的 Python 源代码创建了一个目录 exe。在我的代码中,我使用图像并将图像相对图像路径放在 .py 文件旁边。
当我阅读 pyinstaller 文档时,我尝试了两件事:使用 -add 数据的官方方法和将图像直接复制到 main.exe 旁边的另一种方法。
使用这两种方法,我尝试启动 main.exe,但收到未找到错误:
无法打开“bdd_trans.png”:没有这样的文件或目录
因此,我尝试在启动 exe 时查看当前工作目录在哪里:
from os import getcwd
path = getcwd()
print(path)
然后我将所有图像粘贴到打印目录中,然后 exe 应用程序就可以工作了。问题是我必须放置图像的目录位于 Windows 用户数据上,而该目录不在构建文件夹内。因此,我无法将我的应用程序发送给某人并使其立即运行,这是一件大事。
有人知道为什么官方方法对我不起作用吗?
这是我正在运行的 pyinstaller 命令:
pyinstaller --noconfirm --onedir --windowed --icon "C:/app_final_v8/base-de-donnees.ico" --add-data "C:/app_final_v8/actualiser_trans.png;." --add-data "C:/app_final_v8/ajouter_trans.png;." --add-data "C:/app_final_v8/bdd_trans.png;." --add-data "C:/app_final_v8/client_trans.png;." --add-data "C:/app_final_v8/composant_trans.png;." --add-data "C:/app_final_v8/cyxplus_red.png;." --add-data "C:/app_final_v8/employees_trans.png;." --add-data "C:/app_final_v8/equipement_trans.png;." --add-data "C:/app_final_v8/exporter_trans.png;." --add-data "C:/app_final_v8/modifier_trans.png;." --add-data "C:/app_final_v8/quitter_trans.png;." --add-data "C:/app_final_v8/rechercher_trans.png;." --add-data "C:/app_final_v8/retour_trans.png;." --add-data "C:/app_final_v8/site_trans.png;." --add-data "C:/app_final_v8/supprimer_trans.png;." --add-data "C:/app_final_v8/ticket_trans.png;." --add-data "C:/app_final_v8/trait.png;." "C:/app_final_v8/main.py"
这是尝试运行 exe 的输出:
Traceback (most recent call last):
File "main.py", line 7, in <module>
File "app.py", line 98, in __init__
File "page_accueil.py", line 26, in __init__
File "tkinter\__init__.py", line 4061, in __init__
File "tkinter\__init__.py", line 4006, in __init__
_tkinter.TclError: couldn't open "bdd_trans.png": no such file or directory
[11300] Failed to execute script 'main' due to unhandled exception!
以下是我使用数据图像的方式:
correspondance_table_icone = {
"activite_client": "trait.png",
"type_anomalie": "trait.png",
"client": "client_trans.png",
"composant": "composant_trans.png",
"contrat_maintenance": "trait.png",
"employe":"employees_trans.png",
"equipement": "equipement_trans.png",
"extension_chrono": "trait.png",
"fabricant_composant": "trait.png",
"fonction_composant": "trait.png",
"pays": "trait.png",
"sous_client": "trait.png",
"ticket": "ticket_trans.png",
"trigramme": "trait.png",
"type_equipement": "trait.png",
"type_ticket": "trait.png",
"site": "site_trans.png",
"ville": "trait.png"
}
for ligne in range(len(controller.base.nom_tables)):
table = controller.base.nom_tables[ligne]
icon_image = PhotoImage(file = correspondance_table_icone[table])
self.dict_bouton_tab[table] = tb.Button(canvas_tab.interior, text = correspondance_table_tab[table][0], image=icon_image, compound="left", style = 'Custom_tab.Outline.TButton', command = lambda _table = table: self.afficher_table(controller.base, _table), bootstyle = INFO)
self.dict_bouton_tab[table].image = icon_image
self.dict_bouton_tab[table].grid(row = correspondance_table_tab[table][1], column = 0, sticky = "nsew")
Tkinter 不知道 bdd_trans.png 的位置。您需要修改程序才能检测到这些文件。我建议执行以下操作:
sys.path 包含 Python 在其中查找导入模块和类似文件的目录。通过附加子文件夹的路径,您可以让 Python 解释器找到您移动的文件。在上面的代码中,sys.path包含当前工作目录(getcwd)和子文件夹名称“lib”,可以将其调整为您喜欢的任何名称。
您提供的任何运行时挂钩都将在主脚本之前执行。您可以简单地修改 *.spec 文件或使用相应的控制台命令:
有关详细说明,请参阅以下媒体文章。