Найти - Пользователи
Полная версия: иконки после сборки в pyinstaller (одна есть, другой нет)
Начало » GUI » иконки после сборки в pyinstaller (одна есть, другой нет)
1 2
DarkNocturne
Tseka
Делаю так : 1) В designer создаю файл ресурсов “rc.grc” вставляю туда иконку.2) с помощью pyrcc5.exe преобразую в rc_rc.py код файл ресурсов “C:\Program Files\Python36\Scripts\pyrcc5.exe” rc.qrc -o rc_rc.py3) import rc_rc

Я без QtDesigner делаю программу - у меня есть PyQt5 + pyinstaller = как мне с ними запаковать icon.ico в корень выходящего .exe ???
Tseka
 from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1097, 520)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/icon/name.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
...............................
.............................
DarkNocturne
Tseka
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(“MainWindow”)
MainWindow.resize(1097, 520)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(“icon/name.ico”), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
………………………….
………………………..

Не помогло - я убрал параметр –icon=icon.ico при “компиляции” через pyinstaller, и оставил только твой код и это помогло установить иконку в проводнике windows (см. первый скриншот), но при запуске в заголовке окна и на панели задач все осталось также (см. скриншоты 2 и 3)

P.S. Нажми на скриншот, чтобы увидеть его полностью (на миниатюре ничего вообще не понятно, от слова “вообще”)

1) 2) 3)
PEHDOM
В пиинсталлере есть опция –add-data позволяющая запихнуть в ваш екзешник любые файлы.
https://pyinstaller.readthedocs.io/en/v3.3.1/spec-files.html#adding-files-to-the-bundle
Но при запуске этого экзешника оно же все содержимое раcпакует куданить в %TEMP%\_MEIXXXX.
Однако пиинсталлер добавляет атрибут sys._MEIPASS, который содержит абсолютный путь к временной папке, вот оотудова нужно достать вашу иконку типа такого:
 ...
icon = 'icon.ico'
try:
   ico_path = sys._MEIPASS
except AttributeError:
   ico_path = '.'
icon_file = os.path.join(ico_path, icon)
...
или как вариант создать просто модуль назовем его icons.py, куда запихнуть иконку в “текстовом” виде , а потом сделать from icons import icon, (тогда пиинсталлер сам затянет нужный модуль) и сковертировать обратно и установить, примерно так https://www.programcreek.com/2013/09/convert-image-to-string-in-python/
DarkNocturne
PEHDOM
или как вариант создать просто модуль назовем его icons.py, куда запихнуть иконку в “текстовом” виде , а потом сделать from icons import icon, (тогда пиинсталлер сам затянет нужный модуль) и сковертировать обратно и установить, примерно так https://www.programcreek.com/2013/09/convert-image-to-string-in-python/

При декодировании выдает вот это
 Traceback (most recent call last):
  File "C:\programm\icons.py", line 9, in <module>
    fh.write(ico.decode('base64'))
TypeError: a bytes-like object is required, not 'str'

Сам код icon.py вот такой:
 import sys, os
import base64
 
with open("icon.png", "rb") as imageFile:
    ico = base64.b64encode(imageFile.read())
    print(ico)
fh = open("icon.png", "wb")
fh.write(ico.decode('base64'))
fh.close()
PEHDOM
DarkNocturne
При декодировании выдает вот это
попробуй так
 fh.write(base64.b64decode(ico))
DarkNocturne
PEHDOM
попробуй так
  fh.write(base64.b64decode(ico))

Попробовал - теперь выдает это:
 Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 07:18:10) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> 
========================= RESTART: C:\programm\p.py =========================
b''
Traceback (most recent call last):
  File "C:\programm\p.py", line 679, in <module>
    ex = mainframe()
  File "C:\programm\p.py", line 34, in __init__
    self.initUI()
  File "C:\programm\p.py", line 228, in initUI
    self.setWindowIcon(ico)
TypeError: setWindowIcon(self, QIcon): argument 1 has unexpected type 'bytes'
>>> 

Код icons.py:
 import sys, os
import base64
 
with open("icon.png", "rb") as imageFile:
    ico = base64.b64encode(imageFile.read())
    print(ico)
fh = open("icon.png", "wb")
fh.write(base64.b64decode(ico))
fh.close()

+ часть кода, где присваивается иконка внутри p.py:
         self.setFixedSize(960, 540)
        self.center()
        self.setWindowIcon(ico)
        self.setWindowTitle('|Event Matrix|PC edition|')
PEHDOM
DarkNocturne
Код icons.py:

import sys, os
import base64

with open(“icon.png”, “rb”) as imageFile:
ico = base64.b64encode(imageFile.read())
print(ico)
fh = open(“icon.png”, “wb”)
fh.write(base64.b64decode(ico))
fh.close()
это что такое? это же был только пример как сохранить картинку “как текст” и как ее обратно преобразовать в картинку. Вам нужно то что будет после print(ico) скопировать и вставить эту строку в модуль, а в основном модуле считать ее, преобразовать в “картинку” и скормить ее уже QImage -жу либо через BytesIO, либо у QImage есть чтото типа LoadImageFromBytes()(название метода точно не помню…)
DarkNocturne
PEHDOM
это что такое? это же был только пример как сохранить картинку “как текст” и как ее обратно преобразовать в картинку. Вам нужно то что будет после print(ico) скопировать и вставить эту строку в модуль, а в основном модуле считать ее, преобразовать в “картинку” и скормить ее уже QImage -жу либо через BytesIO, либо у QImage есть чтото типа LoadImageFromBytes()(название метода точно не помню…)

Вообщем “спасибо за помощь”, но похоже никак иначе ты мне помочь не смог и несколько дней поисков и кучу проб и ошибок привели меня к единственному работающему способу сборки через .spec файл
Минимум кода в самой программе:
 import sys, os, os.path
...
        if hasattr(sys, "_MEIPASS"):
            icondir = os.path.join(sys._MEIPASS, 'img/icon.png')
        else:
            icondir = 'img/icon.png'
        icon = QIcon(icondir)
        self.setWindowIcon(icon)

И вот это было добавлено в .spec файл:
 added_files = [
         ( 'img/icon.png', 'img' )
         ]
a = Analysis(['p.py'],
             pathex=['C:\\programm'],
             binaries=[],
             datas= added_files,
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
...

P.S. Может быть это кому-то поможет, ибо я уже находил эту тему среди выдачи Яндекса после поискового запроса по поводу запаковки файлов через pyinstaller
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB