使用 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 存储库帐户下获得。
我制作了一个简单的 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 存储库帐户下获得。