Создание exe-файла из python с помощью PySimple GUI и pysimple gui -exemaker - PullRequest
3 голосов
/ 18 июня 2020

Я сделал простую Python3 -программу, которая использует PySimple GUI для создания Windows - GUI -программы. Эта программа также содержит картинку 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)

Пока это работает нормально. Теперь я хочу создать файл windows -exe с помощью pysimple gui -exemaker (версия 1.3):

python -m pysimple gui -exemaker.pysimple gui -exemaker

Скомпилированный exe-файл работает нормально, если изображение CAESAR.png находится в той же папке, что и exe-файл. Если изображение находится не в той же папке, что и exe-файл, я получаю сообщение об ошибке. Вопрос: Как я могу заставить pysimple gui -exemaker «встроить» файл изображения в exe-файл, чтобы этот exe-файл работал правильно без дополнительного CAESAR.png в той же папке?

в соответствии с ответом и ссылкой, предоставленной мной @BhargavDesai, чтобы получить относительный путь, сделал следующее:

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")

К сожалению, следующие шаги, указанные в ссылке, не сработали для меня. есть подсказки?

Ответы [ 2 ]

3 голосов
/ 19 июня 2020

Чтобы решить эту проблему, нам нужно специально сообщить Pyinstaller, что у нас есть дополнительные файлы, которые необходимо «связать» с приложением.

Нам также необходимо использовать «относительный» путь, поэтому приложение может работать правильно, когда он работает как Python Script или Frozen EXE.

Вы можете найти более подробный ответ здесь: Объединение файлов данных с PyInstaller (--onefile)

1 голос
/ 10 июля 2020

Сначала сделайте это

import base64

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

Затем скопируйте вывод сверху и определите переменную

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