使用 PySimpleGUI 和 pysimplegui-exemaker 从 python 制作 exe 文件

Making exe-file from python with PySimpleGUI and pysimplegui-exemaker

我制作了一个简单的 Python3-program,它使用 PySimpleGUI 创建了一个 Windows-GUI-programm。 该程序还包含一张图片 CAESAR.png,它与我的 python 代码位于同一文件夹中。 这是布局代码的一部分:

import PySimpleGUI as sg


layout = [[sg.Image('CAESAR.png')],
          [sg.Text("Geheime Nachricht in GROSSBUCHSTABEN eintippen:")],
          [sg.Multiline(size=(70,4),key="GEHEIM")],
          [sg.Spin([i for i in range(1,26)], initial_value=12, key="SS"), sg.Text("Schlüssel zwischen 1 und 25 wählen")],
          [sg.Radio("Codieren:", "RADIO1", key="XX" ,default=True),
           sg.Radio("Decodieren:","RADIO1", key="YY")],
          [sg.Text("ERGEBNIS:")],
          [sg.Multiline(size=(70,4),key="AUSGABE")],
          [sg.Button("LOS"), sg.Button("ENDE")]]

window = sg.Window("Cäsars Geheimcode", layout)

到目前为止一切正常。现在我想用 pysimplegui-exemaker(版本 1.3)制作一个 windows-exe 文件:

python -m pysimplegui-exemaker.pysimplegui-exemaker

当图片 CAESAR.png 与 exe 文件位于同一文件夹中时,编译后的 exe 文件运行正常。如果图片与 exe 文件不在同一个文件夹中,我会收到一条错误消息。 问题:如何强制 pysimplegui-exemaker 将图片文件“嵌入”到 exe 文件中,以便该 exe 文件在同一文件夹中没有额外的 CAESAR.png 的情况下正常运行?

根据我@BhargavDesai 给出的答案和 link 做了以下操作,以获得相对路径:

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
    return os.path.join(base_path, relative_path)


bild = resource_path("CAESAR.png")

不幸的是,link 给出的以下步骤对我不起作用。有什么提示吗?

为了解决这个问题,我们需要特别告诉 Pyinstaller 我们有额外的文件需要 "bundled" 与应用程序一起使用。

我们还需要使用 'relative' 路径,这样当应用程序 运行 作为 Python 脚本或 Frozen EXE 时,它可以 运行 正确。

您可以在这里找到更详细的答案:Bundling data files with PyInstaller (--onefile)

首先,这样做

import base64

with open('CAESAR.png', 'rb') as f:
    print(base64.b64encode(f.read()))

接下来复制上面的输出并定义一个变量

CAESAR = b'base64data...'
layout = [[Sg.Image(data=CAESAR)],
...

几周前 PySimpleGUI 项目发布了一个功能更全面的与 PyInstaller 交互的程序....psgcompiler。你可以点安装它。它也可以在 PySimpleGUI GitHub 存储库帐户下获得。