捆绑数据以进行pyinstaller错误(--onefile)

时间:2019-10-30 16:52:06

标签: python pyinstaller

我想为我的.exe包含一个图像。我正在按照here列出的说明进行操作。它说构建在终端中成功完成。当我运行.exe时,它标志着程序中的致命错误。

任何想法表示赞赏。

我的目录如下

/Box Tracking
--/res
----amazon_box.jpg
--main.py
--gui.py

gui.py中的相关代码:

import tkinter as tk
import main
import traceback
import time
import random
# use these libs since base tkinter can only open gif and other obscure formats
# must install Pillow rather than PIL
from PIL import ImageTk, Image
from jokes import jokes
import sys, os # these will allow me to bundle the image in the distro

def resource_path(relative_path):
    '''
    See notes
    :param relative_path: path I will use | string | 'res/amazon-box.jpg'
    :return: string | path
    '''
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

root = tk.Tk()  # create GUI instance
root.geometry("1000x1000") # make GUI big so that users can see it
root.title('Box Tracking') # name GUI

# add a background so users can see it
bg_image = Image.open(resource_path('res/amazon-box.jpg'))
tk_bg_image = ImageTk.PhotoImage(bg_image)
bg = tk.Label(root,image=tk_bg_image)
bg.place(x=0,y=0,relwidth=1,relheight=1)

我用来构建.exe的代码段: pyinstaller --onefile --windowed --add-data res/amazon-box.jpg;. --name "Box Tracking 3.1.5" gui.py

1 个答案:

答案 0 :(得分:0)

也许有更好的方法,但是我这样做是这样的:

\res\目录中,我有amazon_box.py和一个空的__init__.py

您可以使用小脚本将图像转换为base64,例如:

import base64
with open("amazon_box.jpg", "rb") as image:
    b = base64.b64encode(image.read())
with open("amazon_box.py", "w") as write_file:
    write_file.write("def photo(): return (" + str(b) + ")"

amazon_box.py中将具有(由以上脚本自动创建):

def photo(): return (image_as_base64)

此后,可以在PhotoImage(data = )的主脚本中使用该图像:

import tkinter as tk
from res import amazon_box

root = tk.Tk()  # create GUI instance

root.geometry("1000x1000") # make GUI big so that users can see it
root.title('Box Tracking') # name GUI

# add a background so users can see it
tk_bg_image = tk.PhotoImage(data = amazon_box.photo())
bg = tk.Label(root,image=tk_bg_image)
bg.place(x=0,y=0,relwidth=1,relheight=1)

很显然,我还没有使用您的图像对其进行测试,但这是我过去将图像包装到一个文件中的方式,并且您可以在一个.py文件中包含多个图像,因此实际上可以一个非常干净的最终结果。

编辑:

由于此时它只是PyInstaller的另一个模块,所以我的构建命令是标准的:pyinstaller.exe --windowed --onefile "path\to\main\py\file"

我通常只是在命令提示符下运行PyInstaller。