Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » иконки после сборки в pyinstaller (одна есть, другой нет) [RSS Feed]

#1 Сен. 6, 2018 14:49:15

DarkNocturne
Зарегистрирован: 2018-08-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

иконки после сборки в pyinstaller (одна есть, другой нет)

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 ???

Офлайн

#2 Сен. 6, 2018 15:22:11

Tseka
Зарегистрирован: 2016-12-27
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

иконки после сборки в pyinstaller (одна есть, другой нет)

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

Отредактировано Tseka (Сен. 6, 2018 15:22:33)

Офлайн

#3 Сен. 7, 2018 12:10:25

DarkNocturne
Зарегистрирован: 2018-08-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

иконки после сборки в pyinstaller (одна есть, другой нет)

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)

Отредактировано DarkNocturne (Сен. 7, 2018 12:13:05)

Офлайн

#4 Сен. 7, 2018 14:11:50

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

иконки после сборки в pyinstaller (одна есть, другой нет)

В пиинсталлере есть опция –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/



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 7, 2018 18:09:07)

Офлайн

#5 Сен. 7, 2018 17:55:21

DarkNocturne
Зарегистрирован: 2018-08-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

иконки после сборки в pyinstaller (одна есть, другой нет)

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

Отредактировано DarkNocturne (Сен. 7, 2018 17:56:33)

Офлайн

#6 Сен. 7, 2018 18:06:01

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

иконки после сборки в pyinstaller (одна есть, другой нет)

DarkNocturne
При декодировании выдает вот это
попробуй так
 fh.write(base64.b64decode(ico))



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 7, 2018 18:06:11)

Офлайн

#7 Сен. 10, 2018 08:26:25

DarkNocturne
Зарегистрирован: 2018-08-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

иконки после сборки в pyinstaller (одна есть, другой нет)

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

Отредактировано DarkNocturne (Сен. 10, 2018 08:26:59)

Офлайн

#8 Сен. 10, 2018 18:12:20

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

иконки после сборки в pyinstaller (одна есть, другой нет)

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()(название метода точно не помню…)



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Сен. 10, 2018 18:13:24)

Офлайн

#9 Сен. 11, 2018 13:09:48

DarkNocturne
Зарегистрирован: 2018-08-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

иконки после сборки в pyinstaller (одна есть, другой нет)

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

Отредактировано DarkNocturne (Сен. 11, 2018 13:12:44)

Офлайн

  • Начало
  • » GUI
  • » иконки после сборки в pyinstaller (одна есть, другой нет)[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version