2011-01-01 3 views
9

У меня есть приложение PySide, которое имеет значок для MainWindow (пример QMainWindow). Когда я обычно запускаю файл, значок отображается и все в порядке, но когда я создаю exe с py2exe, значок не отображается. Это также происходит с cx_freeze (поэтому я не думаю, что проблема связана с py2exe).PyQt/PySide - значок дисплея

Приложение было разработано с использованием QtDesigner и преобразовано в python с pyside-uic. Я пробовал использовать значки как файл и как ресурс (файл qrc), и оба они, похоже, не работают.

Любая помощь или указатели будут оценены.

Спасибо.

ответ

4

решение kochelmonster работает так долго так как вы не пытаетесь объединить DLL-файлы Qt в library.zip или exe. Вам также не нужно устанавливать путь к библиотеке, если вы поместите плагины в базу каталога приложений.

Я все еще хотел связать все остальное, поэтому я исключил dll qt и добавил их вручную. Мой setup.py выглядит примерно так:

from os.path import join 

_PYSIDEDIR = r'C:\Python27\Lib\site-packages\PySide' 
data_files =[('imageformats',[join(_PYSIDEDIR,'plugins\imageformats\qico4.dll')]), 
       ('.',[join(_PYSIDEDIR,'shiboken-python2.7.dll'), 
       join(_PYSIDEDIR,'QtCore4.dll'), 
       join(_PYSIDEDIR,'QtGui4.dll')]) 
       ] 
setup(
    data_files=data_files, 
    options={ 
     "py2exe":{ 
      "dll_excludes":['shiboken-python2.7.dll','QtCore4.dll','QtGui4.dll'], 
      "bundle_files": 2 
      ... 
     } 
    } 
    ... 
) 

Если ваш проект использует дополнительные библиотеки DLL Qt, вам придется исключить и вручную добавить их. Если вам нужно загрузить что-то другое, кроме изображения .ico, вам также нужно будет добавить правильный плагин.

+0

Привет, спасибо за ответ. Это сработало, но мне пришлось изменить путь изображения или значка к его абсолютному пути с помощью '\\' es вместо /. Это работало для pyinstaller, хотя для него не нужен файл установки. – user547057

+0

Мне нравится помещать значки в файлы ресурсов .qrc и компилировать их в код python, чтобы избежать подобных проблем. Вам также не нужно беспокоиться о том, чтобы значки и изображения были включены в ваши скрипты сборки. Поэтому вы можете попробовать использовать их снова. – Gerald

+0

@Gerald - Есть ли какая-то особая причина, по которой вы включили шибокен в этот ответ? Насколько я могу сказать, без этого все работает. – ArtOfWarfare

2

Я предполагаю, что это работает с BMP, но не png/jpg? Если это так, вполне вероятно, что плагины формата изображения не загружаются должным образом.

Я бы предположил, что создаю файл qt.conf в каталоге установленного приложения и убедившись, что плагин-dll переходит к/plugins/imageformats /, улучшит работу.

+1

Ну, это на самом деле файл .ico. Я не смог заставить значки работать и решил переключить приложение на wxpython, где присутствует инструмент для преобразования изображений в файлы python. При этом у меня не было проблем с окончательным исполнением. Поскольку я использовал wxformbuilder для создания пользовательского интерфейса, для преобразования приложения не потребовалось слишком много времени. Благодарю. – user547057

+0

@ user547057: Ах. Это скорее вопрос py2exe/cz_freeze, а не Qt. – Macke

2

У меня была та же проблема. После некоторого исследования я нашел решение: (Маке был правильная идея)

cx_freeze не копирует каталог PyQt плагин, который содержит читатель ico изображений. Вот шаги:

  1. в setup.py скопировать каталог PyQt4 плагинов для вашего дистрибутива
  2. в коде написать что-то вроде:
application_path = os.path.split(os.path.abspath(sys.argv[0]))[0] 
try: 
    if sys.frozen: 
     plugin_path = os.path.join(application_path, "qtplugins") 
     app.addLibraryPath(plugin_path) 
except AttributeError: 
    pass 
+1

Еще лучше, просто скопируйте папку 'imageformats' туда, где находится ваш двоичный файл. –

0

Вы должны включить "qico4.dll" вручную в папку выпуска. Вставьте это в свой setup.py:

import sys 
from os.path import join, dirname 
from cx_Freeze import setup, Executable 

_ICO_DLL = join(dirname(sys.executable), 
        'Lib', 'site-packages', 
        'PySide', 'plugins', 
        'imageformats', 'qico4.dll') 

build_exe = { 
     'include_files': [(
       _ICO_DLL, 
       join('imageformats', 'qico4.dll'))]} 

setup(name = "xxxxx", 
     version = "1.0.0", 
     ... 
     options = { ... 
       'build_exe': build_exe 
        ...}, 
     ...)