使用Max和这篇关于添加额外数据文件(如图像或声音)以及我自己的研究/测试的帖子的出色答案,我已经找到了我认为添加此类文件的最简单方法。
如果您想查看一个实时示例,我的存储库位于GitHub 上。
注意:这是为了使用pyinstaller的--onefile
or命令进行编译。-F
我的环境如下。
- Python 3.3.7
- Tkinter 8.6 (检查版本)
- 安装程序 3.6
分两步解决问题
为了解决这个问题,我们需要特别告诉 Pyinstaller 我们有额外的文件需要与应用程序“捆绑”。
我们还需要使用“相对”路径,以便应用程序在作为 Python 脚本或 Frozen EXE 运行时可以正常运行。
话虽如此,我们需要一个允许我们拥有相对路径的函数。使用Max Posted的功能,我们可以轻松解决相对路径。
def img_resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
我们将像这样使用上述函数,这样当应用程序作为脚本或冻结 EXE 运行时,应用程序图标就会显示出来。
icon_path = img_resource_path("app/img/app_icon.ico")
root.wm_iconbitmap(icon_path)
下一步是我们需要指示 Pyinstaller 在编译时在哪里可以找到额外的文件,以便在运行应用程序时,它们会在临时目录中创建。
如文档中所示,我们可以通过两种方式解决此问题,但我个人更喜欢管理我自己的 .spec 文件,因此我们将这样做。
首先,您必须已经有一个 .spec 文件。就我而言,我可以通过运行额外的参数来创建我需要的东西,你可以在这里pyinstaller
找到额外的参数。因此,我的规范文件可能看起来与您的略有不同,但在我解释了重要的部分后,我将其全部发布以供参考。
added_files本质上是一个包含元组的列表,在我的情况下,我只想添加一个图像,但您可以使用添加多个 ico、png 或 jpg('app/img/*.ico', 'app/img')
您也可以像这样创建另一个元组added_files = [ (), (), ()]
以进行多个导入
元组的第一部分定义了您要添加的文件或文件类型以及在哪里找到它们。将此视为 CTRL+C
元组的第二部分告诉 Pyinstaller,创建路径“app/img/”并将该目录中的文件相对于运行 .exe 时创建的任何临时目录。将此视为 CTRL+V
在 下a = Analysis([main...
,我设置datas=added_files
了 ,最初它曾经是,datas=[]
但我们希望导出的导入列表是导入的,所以我们传入我们的自定义导入。
除非您想要 EXE 的特定图标,否则您不需要这样做,在规范文件的底部,我告诉 Pyinstaller 使用选项为 exe 设置我的应用程序图标icon='app\\img\\app_icon.ico'
。
added_files = [
('app/img/app_icon.ico','app/img/')
]
a = Analysis(['main.py'],
pathex=['D:\\Github Repos\\Processes-Killer\\Process Killer'],
binaries=[],
datas=added_files,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='Process Killer',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True , uac_admin=True, icon='app\\img\\app_icon.ico')
编译成EXE
我很懒惰;我不喜欢打字超过我必须的东西。我创建了一个可以单击的 .bat 文件。您不必这样做,没有它,此代码将在命令提示符 shell 中运行。
由于 .spec 文件包含我们所有的编译设置和参数(又名选项),我们只需将该 .spec 文件提供给 Pyinstaller。
pyinstaller.exe "Process Killer.spec"