我在使用 pyinstaller 将代码转换为可执行文件时遇到问题。这是使用 tkfilebrowser 选择目录并打印它们的代码。如果你在 python 上尝试它,它运行时不会出现重大问题。但是,如果您尝试使其成为可执行文件,则当您尝试选择目录时,它不起作用,并出现错误:“_tkinter.TclError:无法打开”C:Users ... kfilebrowser ... ile.png “: 没有这样的文件或目录”。我将不胜感激任何帮助。下面是有关代码和错误的更多详细信息。
我的简单代码如下:
import tkinter as tk
import tkfilebrowser
root = tk.Tk()
canvas = tk.Canvas(root, height=600, width=1133, bg="black")
canvas.pack()
frame = tk.Frame(root, bg="white")
frame.place(relwidth=0.96, relheight=0.6, relx=.02,rely=0.28)
dirs=[]
def get_directories():
aux=[]
aux.append(tkfilebrowser.askopendirnames(initialdir="/"))
for i in aux[0]:
dirs.append(i)
print(dirs)
return dirs
selectFolder = tk.Button(root, text= '1 - Select Folder', padx=5, pady=5, fg="white",
bg="#263D42", command = get_directories)
selectFolder.pack(side=tk.RIGHT)
root.mainloop()
要将其转换为可执行文件,我在 cmd 上使用以下命令(我使用名称“test”保存文件):
pyinstaller.exe --onefile --test.py
问题是 pyinstaller 没有导入 tkfilebrowser 模块。您应该手动导入。 请使用以下代码在规范文件中添加 tkfilebrowser 文件夹的路径:
# test.spec file
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
a.datas += Tree("C:\\Users\\I_like_chocolate\\Miniconda3\\Lib\\site-
packages\\tkfilebrowser\\", "tkfilebrowser") # !!! Path to add
再次运行之前,请务必先保存 test.spec 文件。然后,您应该使用以下命令在 cmd 中运行 test.spec 文件,而不是运行 pyinstaller.exe --onefile --test.py
命令:
# cmd
pyinstaller.exe test.spec
我认为这种方式更容易:import os
import sys
def resource_path(relative_path):
try:
base_path = sys._MEIPASS # after running the pyinstaller, if still looking
# for temp folder then use sys._MEIPASS2 and if needed \\ instead of / for
# all the path directories
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
更换
"folder_names/file_names"
与
resource_path("file_names/file_names")
在终端类型中:
pyinstaller.exe --onefile --windowed --icon=your_image.ico Your_File.py
或 在 Windows CMD 中(在 cmd 中安装 pyinstaller 后)输入:
pyinstaller --onefile --windowed --icon=your_image.ico Your_File.py
可执行文件将位于名为“dist”的新文件夹中。现在将所有依赖文件夹复制到“dist”文件夹中
运行 .exe,如果一切正常,则压缩文件夹以共享。
删除 Build 和 Dist 文件夹以及任何 .spec 文件。
更换
resource_path("folder_names/file_names")
返回
"folder_names/file_names"
如果找不到文件错误: 使用 MEIPASS 代替 MEIPASS2,反之亦然,然后使用 \ 代替 /(如果需要)。要更进一步将其转换为安装程序文件,请使用“inno setup”软件。