将 .py 文件和图像转换为独立的可执行文件

Convert .py file and image to standalone executable

我有 python 程序,旁边有一张图片。该图像显示在程序创建的 tkinter window 中并且是必需的。我想使用 pyinstaller 将 .py 文件和 .gif 文件组合成一个可执行文件。

我知道要创建一个独立的 .py 文件,您需要使用 --onefile 但我不知道如何处理涉及的图像。我比较确定您必须编辑 .spec 文件,但我不知道如何去做。

我不关心程序的图标,只关心 tkinter 中的图像 window。

由于我是初学者,请提供分步说明。

您需要将图像 "attach" 添加到您的程序中。您可以这样做:

--add-data "The file you want to add."

但是,在您的代码中,当引用图像文件时,您需要这样做:

image_file = sys._MEIPASS + "\file.gif"

为什么?因为现在文件在程序里面,用来表示文件在程序里面的目录是:sys._MEIPASS.

您可以对您的 GIF 文件进行 base64 编码并将其作为字符串存储在您的 Python 脚本中 - 这样您就不需要随身携带额外的 GIF 文件了。

因此,假设您的图像位于名为 image.gif 的文件中,您可以在终端中执行以下操作:

base64 -i image.gif -o image.b64

然后复制文件 image.b64 的(文本)内容并存储在 Python 变量中:

photo = """R0lGODlh4gLxAPcAAAQEBAoGBgo...L+SwTBVhBCtCVf6lAE"""

然后加载图像:

photo = PhotoImage(data=photo)

经过多次试验,我得到了一个可以运行的示例。这是一个加载图像并显示它的小示例脚本 - 唯一棘手的部分是它决定它是 运行ning 来自捆绑包还是实时。

#!/usr/local/bin/python3
from PIL import Image                                                                       
import sys, os

filename = "image.png"

# Work out where the image file is
if getattr( sys, 'frozen', False ) :
   # running in a bundle
   path = os.path.join(sys._MEIPASS, filename)
else :
   # running live
   path = filename

im = Image.open(path)                                                                
im.show() 

然后我使用 PyInstaller 将其构建到一个文件中,如下所示:

pyinstaller --add-data "image.png:." --onefile test.py 

这会创建一个名为 dist 的目录,您会在其中找到一个名为 test 的文件,该文件可以 运行 在具有相同 OS 的其他计算机上但没有安装 Python。