Значок приложения в PySide GUI

у меня есть приложение PySide GUI (написано на Python 3, работает на Windows 7 Pro), в котором я устанавливаю значок приложения следующим образом:

class MyGui(QtGui.QWidget):
    def __init__(self):
        super(MyGui, self).__init__()
        ...
        self.setWindowIcon(QtGui.QIcon('MyGui.ico'))

        if os.name == 'nt':
            # This is needed to display the app icon on the taskbar on Windows 7
            import ctypes
            myappid = 'MyOrganization.MyGui.1.0.0' # arbitrary string
            ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
        ...

понял, что ctypes вещи из ответ. Если я удалю эти строки, то значок Python будет отображаться на панели задач при выполнении python MyGui.py.

С этими строками в комплекте все выглядит отлично, с правильным значком на окне и панели задач. Однако, когда я упаковываю gui с помощью cxfreeze, оба значки окна и панели задач изменяются на общие окна.значок exe.

я использую cxfreeze.bat чтобы упаковать приложение, используя найденные инструкции здесь, включая --icon переключатель. Использование этого переключателя делает сгенерированный exe правильным значком при просмотре в проводнике. Однако окно приложения и панель задач не показывают значок при запуске приложения. Я пробовал копировать .ICO-файл в том же каталоге, как .но это не помогает.

я получаю такое же поведение в Windows 7 и 8. Любопытно, что если я прикрепляю приложение к панели задач, значок панели задач отображается правильно, но значок окна по-прежнему является общим значком exe.

Как правильно отобразить значок?

2 ответов


PySide нужен доступ к специальной DLL для чтения .файлы ico. Я думаю, это qico4.файл DLL.

вы можете попробовать изменить вызов setWindowIcon, чтобы открыть значок как a .png и поставить .ПНГ в ./ dist каталог и посмотреть, работает ли это. Если да, то ваш код в порядке, и я уверен, что это так .проблема с dll. Вам нужно будет сказать cx_freeze, чтобы включить dll в сборку.

Я думаю, что PySide предоставляет встроенный .ico для Windows и не нужно уметь читать сами данные, вот почему это работает. Однако для чтения встроенного ресурса значка или файла ico в исполняемом каталоге ему понадобится DLL.


Я нашел другое решение, которое не требует наличия значка в форматах PNG и ICO. Как упоминает Саймон в своем ответе,qico4.dll файлы требуется для чтения .файлы ico. Кроме того, этот файл должен быть помещен в каталог с именем imageformats это подкаталог вашего каталога приложений. Структура папок должна выглядеть следующим образом:

My Gui
|
|-- MyGui.exe
|-- QtCore4.dll
|-- QtGui4.dll
|-- ...
|
|-- imageformats
    |
    |-- qico4.dll

qico4.dll файлы устанавливается с вашим дистрибутивом PySide. Если вы выбираете типичные параметры установки, файл должно быть под

os.path.join(os.path.dirname(sys.executable), 
             'Lib',
             'site-packages',
             'PySide',
             'plugins',
             'imageformats' )