2013-06-12 3 views
9

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

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 материала от this answer. Если я удалю эти строки, тогда значок Python будет отображаться на панели задач при выполнении python MyGui.py.

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

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

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

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

ответ

7

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

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

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

+0

Это работает! Огромное спасибо. Я видел некоторую информацию, говорящую о требовании qico4.dll, но решения о том, где это сделать, были разными, и пара, которую я пробовал, не работала. Иметь значок как .ico, так и .png не самый лучший, но это самое простое решение проблемы. – Praetorian

5

Я нашел другое решение, которое не требует наличия значка в форматах 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') 
+1

Хорошее продолжение, хорошо иметь всю эту информацию в одном месте .. –

Смежные вопросы