2011-01-01 5 views
9

Ho un'app PySide con un'icona per MainWindow (un'istanza QMainWindow). Quando eseguo normalmente il file, l'icona è visibile e tutto è a posto, ma quando creo un exe con py2exe, l'icona non viene visualizzata. Questo succede anche con cx_freeze (quindi non penso che il problema sia con py2exe).PyQt/PySide - visualizzazione icone

L'app è stata progettata utilizzando QtDesigner e convertita in python con pyside-uic. Ho provato sia usando le icone come file sia come risorsa (file qrc) ed entrambi non sembrano funzionare.

Qualsiasi aiuto o suggerimento sarebbe apprezzato.

Grazie.

risposta

4

soluzione kochelmonster funziona così a lungo poiché non provi a raggruppare le DLL Qt in library.zip o in exe. Inoltre, non è necessario impostare un percorso di libreria se si inseriscono i plug-in nella base della directory dell'app.

Desideravo ancora unire tutto il resto, quindi ho escluso le qt dll e le ho aggiunte manualmente. Il mio setup.py simile a questa:

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

Se il progetto utilizza aggiuntivi DLL Qt si dovrà escludere e aggiungere manualmente loro. Se devi caricare qualcosa di diverso da un'immagine .ico, devi anche aggiungere il plug-in corretto.

+0

Ciao, grazie per aver risposto. Questo ha funzionato, ma ho dovuto cambiare il percorso dell'immagine o dell'icona nel suo percorso assoluto con '\\' es invece di /. Questo ha funzionato con pyinstaller anche se per esso non è necessario alcun file di installazione. – user547057

+0

Mi piace mettere le icone nei file di risorse .qrc e compilarle in codice python per evitare problemi di percorso del genere. Inoltre, non devi preoccuparti di assicurarti che le icone e le immagini siano incluse negli script di compilazione. Quindi potresti provare a usarli di nuovo. – Gerald

+0

@Gerald - C'è qualche ragione particolare per cui hai incluso Shiboken in questa risposta? Per quanto posso dire, funziona senza questo. – ArtOfWarfare

2

Suppongo che funzioni con un bmp, ma non con un png/jpg? In tal caso, è probabile che i plug-in di formato immagine non vengano caricati correttamente.

Immagino di dover impostare un file qt.conf nella directory dell'applicazione installata e verificare che plugin-dll passi a/plugins/imageformats/migliori le cose.

+1

Bene, in realtà è un file .ico. Non sono riuscito a far funzionare le icone e ho deciso di passare l'applicazione a wxpython, dove è presente uno strumento per convertire le immagini in file Python. Con esso, non ho avuto problemi nell'esecuzione finale. Da quando ho usato wxformbuilder per costruire l'interfaccia utente, non ci è voluto troppo tempo per convertire anche l'app. Grazie. – user547057

+0

@ user547057: Ah. Questa è più una domanda py2exe/cz_freeze piuttosto che una Qt. – Macke

2

Ho avuto lo stesso problema. Dopo alcune indagini ho trovato una soluzione: (Macke avuto l'idea giusta)

cx_freeze non copiare la directory PyQt plugin, che contiene il lettore di immagini ico. Ecco i passaggi:

  1. in setup.py copia della directory PyQt4 plugin per la vostra distribuzione
  2. Nel codice scrivere qualcosa di simile:
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

Ancora meglio, copia semplicemente la cartella 'imageformats' su dove si trova il tuo binario. –

0

È necessario includere "qico4.dll" manualmente nella cartella di rilascio. Inserisci questo nel tuo 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 
        ...}, 
     ...)