将 .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。
我有 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。