Как загрузить независимый от пути образ в Python tkinter, делая исполняемый файл независимым от пути к изображению? - PullRequest
0 голосов
/ 04 октября 2018

Я программирую на spyder 3.2.8;python 3.6 с использованием tkinter.Настроил весь мой скрипт и использовал pyinstaller для разработки приложения.

В моем скрипте я хочу включить функцию iconbitmap('').Проблема заключается в том, что когда я делаю это, я указываю путь к изображению, и при разработке приложения возникает ошибка, когда я перемещаю приложение на другой ПК.

Я знаю, почему возникает эта ошибка.Это связано с тем, что указанный путь к файлу не существует на новом ПК.

Я хочу изменить значок виджета с помощью этой функции.Это работает так, как я сказал в своем сценарии, но как только я разрабатываю и переносу с одного компьютера на другой, он не может найти изображение, о котором идет речь, и, следовательно, создает проблему.

Это специфическая часть кода, которую я пытаюсь запустить:

window= tk.Tk()
window.title("Heating Requirement")
window.geometry("650x275")


window.iconbitmap(r'LOGO.ico')

Как видите, это просто, но зависит от пути.

В моем скрипте этоработает отлично.Однако проблема заключается в том, что, как указано выше, изображение зависит от пути.

Есть ли способ сообщить pyinstaller, что нужно изменить карту значков вместо того, чтобы делать это в скрипте, что делает его зависимым от пути ....

Если вы скажете pyinstaller изменить значок приложения, он не будет зависеть от пути, так как он включает образ в сборку.Я хочу, чтобы pyinstaller также включал изображение iconbitimage в сборку.

Возможно, существует внешний способ изменить изображение iconbitimage.Значение вне сценария?

Есть ли способ навсегда изменить изображение значка в tkinter?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Итак, я понял это пару месяцев назад, просто забыл опубликовать ответ:

Первый шаг: Написать в сценарии: *

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)

image_path = resource_path("LOGO.ico")

window= tk.Tk()

window.iconbitmap(image_path)

Последовательно: запустить готовый сценарийчерез pyinstaller и позвольте ему создать файл спецификации (в cmd, открытом в том же окне, что и ваш файл .py и .spec):

pyinstaller.exe -f -F program_name.py

В-третьих: найдите созданный файл program_name.spec под вами имя_программы.pyСценарий и откройте имя_программы.spec с помощью NotePad.

Четвертое: Теперь скопируйте и вставьте приведенную ниже информацию в файл спецификации и измените необходимую информацию.

# -*- mode: python -*-
a = Analysis(['C:\\Users\\Aston
\\AppData\\Local\\Programs\\Python\\Python36\\Scripts\\program_name.py'],
                 pathex=['C:\\Users\\Aston 

\\AppData\\Local\\Programs\\Python\\Python36\\Scripts'],
                 hiddenimports=[],
                 hookspath=None)
    a.datas += [ ('image_name.ico', 'C:\\Users\\Aston
\\AppData\\Local\\Programs\\Python\\Python36\\Scripts\\Image_name.ico', 'DATA')]

pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('dist', 'What ever you want to name program.exe'),
          debug=False,
          strip=None,
          upx=True,
          console=False , icon='C:\\Users\\Aston\\AppData\\Local\\Programs\\Python\\Python36\\Scripts\\image_name.ico')

Не забудьте сохранить файл спецификации.

Пятое: Теперь снова запустите pyinstaller, но на этот раз используйте (в cmd, открытом в том же окне, что и ваши файлы .py и .spec):

pyinstaller.exe -f -F program_name.spec
0 голосов
/ 04 октября 2018

Скажем, у вас есть приложение в

/home/aston/app/script.py

, тогда вы можете поместить изображение в

/home/aston/app/images/foo.png

и ссылаться на него из скрипта как

import os
dirname = os.path.dirname(__file__)
os.path.join(dirname, "image", "foo.png")

который возьмет путь к текущему сценарию и добавит image/foo.png

Теперь предположим, что вы скопировали его на компьютер вашего друга Боба и теперь у него есть

/home/bob/app/script.py

и

/home/bob/app/image/foo.png

Изображение все еще находится в пути image/foo.png относительно относительно местоположения script.py, следовательно, путь построения в сценарии будет по-прежнему правильным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...