2011-01-01 18 views
9

Mam aplikację PySide, która ma ikonę dla instancji MainWindow (a QMainWindow). Kiedy normalnie uruchamiam plik, ikona jest widoczna i wszystko jest w porządku, ale kiedy utworzę plik exe z py2exe, ikona nie pojawi się. Dzieje się tak również z cx_freeze (więc nie sądzę, że problem jest z py2exe).PyQt/PySide - wyświetlanie ikon

Aplikacja została zaprojektowana przy użyciu QtDesigner i przekonwertowana na pythona za pomocą pyside-uic. Próbowałem zarówno przy użyciu ikon jako plik i jako zasób (plik qrc) i oba nie wydają się działać.

Każda pomoc lub wskazówki byłyby mile widziane.

Dzięki.

Odpowiedz

4

rozwiązanie kochelmonster za pracuje tak długo, ponieważ nie próbujesz łączyć bibliotek DLL Qt w library.zip lub exe. Nie musisz także ustawiać ścieżki biblioteki, jeśli umieścisz wtyczki w katalogu głównym aplikacji.

Nadal chciałem spakować wszystko inne, więc wyłączyłem qt biblioteki dll i dodałem je ręcznie. Moje setup.py wygląda mniej więcej tak:

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

Jeśli projekt korzysta z dodatkowych bibliotek DLL Qt będzie trzeba wyłączyć i ręcznie dodać je dobrze. Jeśli chcesz załadować coś innego niż obraz .ico, musisz również dodać odpowiednią wtyczkę.

+0

Cześć, dziękuję za odpowiedź. To zadziałało, ale musiałem zmienić ścieżkę obrazu lub ikony na absolutną ścieżkę za pomocą "\\" zamiast "/". To działało dla programu piorącego, mimo że nie jest potrzebny żaden plik instalacyjny. – user547057

+0

Lubię umieszczać ikony w plikach zasobów .qrc i kompilować je do kodu Pythona, aby uniknąć takich problemów z ścieżką. Nie musisz też martwić się o to, czy ikony i obrazy są zawarte w skryptach kompilacji. Więc możesz spróbować użyć ich ponownie. – Gerald

+0

@Gerald - Czy jest jakiś szczególny powód, dla którego w tej odpowiedzi uwzględniłeś shiboken? O ile wiem, wszystko działa bez tego. – ArtOfWarfare

2

Zakładam, że działa z bmp, ale nie png/jpg? Jeśli tak, to prawdopodobnie wtyczki formatu obrazu nie ładują się prawidłowo.

Domyślam się, że skonfiguruję plik qt.conf w katalogu zainstalowanej aplikacji i upewnię się, że plugin-dll przejdzie do/plugins/imageformats/sprawi, że wszystko będzie działać lepiej.

+1

Cóż, w rzeczywistości jest to plik .ico. Nie mogłem uruchomić ikon i zdecydowałem się przełączyć aplikację na wxpython, gdzie jest dostępne narzędzie do konwersji obrazów do plików Pythona. Dzięki temu nie miałem żadnych problemów w końcowym pliku wykonywalnym. Ponieważ użyłem wxformbuilder do zbudowania interfejsu użytkownika, konwersja aplikacji nie zajęła zbyt wiele czasu. Dzięki. – user547057

+0

@ user547057: Ah. To raczej pytanie py2exe/cz_freeze niż Qt. – Macke

2

Miałem ten sam problem. Po jakimś dochodzeniu znalazłem rozwiązanie: (Macke miał prawo pomysł)

cx_freeze nie kopiuje katalog PyQt wtyczek, który zawiera czytnik ico obrazu. Oto kroki:

  1. w setup.py kopię katalogu PyQt4 wtyczek do dystrybucji
  2. w kodzie napisać coś takiego:
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

Co więcej, po prostu skopiuj folder 'imageformats' do miejsca, w którym znajduje się twój plik binarny. –

0

Musisz dodać "qico4.dll" ręcznie w swoim folderze wydania. Wstaw to w swoim 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 
        ...}, 
     ...)