Как с помощью модуля auto-py-to-exe упаковать проект python в один файл вместе с картинками?
Нашел ответ, что для упаковки картинок нужно использовать данную функцию. Но я в упор не понимаю какое отношение эта функция имеет к интерфейсу auto-py-to-exe и как с её помощью упаковать картинки.
Упаковка без картинок и упаковка в папку работают без проблем. Вопрос именно в создании одного файла .exe с добавлением внешних изображений.
def resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
Ответы (2 шт):
Спасибо Alex Titov за наводку на байтовые константы. В моём случае нужно было еще изменить размер картинок, так что использовал библиотеку io в дополнение к его варианту. С её помощью после изменения размера смог получить длиннющую строку отображения новой картинки в байтовом виде. Далее эту строку сохранил в новую константу, а все остальные строки удалил. Константу уже можно использовать в PhotoImage для присвоения виджетам.
from tkinter import PhotoImage
from io import BytesIO
from PIL import Image
icon = Image.open('icon.png', mode='r').resize((42, 42)).crop() # 42 - требуемый размер
icon_arr = BytesIO()
icon.save(icon_arr, format='PNG')
icon_arr = icon_arr.getvalue()
print(icon_arr) # <- скопировал результат из консоли в новую переменную byte_icon
byte_icon = b'...' # <- тут длинная строка в байтовом виде. Весь код выше можно удалять.
# Кроме "from tkinter import PhotoImage", так как он еще нужен ниже
final_img = PhotoImage(data=byte_icon, format='png')
В итоге в auto-py-to-exe не пришлось добавлять дополнительные файлы и все нормально собралось в один файл .exe
Вот мой пример как закодировать изображение в код, что бы при создании exe файла не нужно было класть рядом изображения. Кодируем изображение:
import base64
with open("icon folder.png", "rb") as image_file:
encoded_string = base64.b64encode(image_file.read())
print(encoded_string)
Копируете полученный код b'***' - он очень длинный. Пример как использовать это изображение.
import tkinter as tk
import base64
class VCardEditor:
def __init__(self, root):
self.root = root
self.root.title("Главное окно")
# Base64 encoded image data
icon_logo_data = b'***' # <- сюда вставить то, что вы кодировали
icon_image_data = base64.b64decode(icon_logo_data)
icon_image = tk.PhotoImage(data=icon_image_data)
self.root.iconphoto(False, icon_image)
# Пример использования изображения на кнопке
button = tk.Button(self.root, image=icon_image, text="Click Me", compound=tk.LEFT)
button.image = icon_image
button.pack()
if __name__ == "__main__":
root = tk.Tk()
app = VCardEditor(root)
root.mainloop()