Pergunta

Eu estou tentando usar uma imagem JPEG em um objeto QImage a partir de um script Python, com PyQt4.

O script em si funciona perfeitamente, a imagem é carregada e pode ser manipulado e processado e tudo. No entanto, quando eu tento "compilar" esse script com py2exe, tudo funciona, mas a imagem JPEG. Substituindo-o por um PNG obras equivalentes, mas desde que meu programa de downloads de imagens da web, eles não serão sempre no formato PNG e eu não posso pagar convertendo-os todos com outra biblioteca.

Eu descobri que o apoio de imagem JPEG para QImage, juntamente com outros formatos de imagem, é fornecido por alguns DLLs na \ qt \ plugins \ imageformats diretório (eles são chamados qjpeg4.dll e qjpeg4d.dll). Eu acho que eu preciso usá-los de alguma forma na minha executável, mas eu não sei como. Eu tentei simplesmente copiá-los para o meu diretório exe, sem sorte. Eu tentei, como indicado aqui , para incluir esses arquivos como data_files no script setup.py, mas sem sorte (parece que tudo que ele faz é copiar esses arquivos para o diretório do exe, por isso não muda nada de copiá-los manualmente de qualquer maneira).

Eu tenho certeza que há um punhado de aplicações lá fora, usando PyQt com imagens JPEG, como é que eles fazem isso? Parecia uma tarefa trivial, mas eu estou preso nele agora.

Além disso, eu quero meu aplicativo para ser multi-plataforma (por que mais eu estaria codificação em Python?), Eu espero que eu não vai correr em problemas desse tipo de embalagem (não é o único) quando a embalagem for OS X ou Linux. Vou?

Foi útil?

Solução

Depois de horas de tropeçando com o mesmo problema, eu gostaria de compartilhar a solução que funcionou para mim no Windows Vista: usando python2.6

copiar o seguinte diretório em seu diretório dist gerado pelo py2exe:

C:\Python26\Lib\site-packages\PyQt4\plugins\imageformats

Eu só caiu o diretório imageformats diretamente em meu diretório dist, sem quaisquer modificações qt.conf ou qualquer coisa assim. Eu não tentei, mas isso pode funcionar para phonon também.

Outras dicas

Vou ter que confessar que nunca conseguiu obter a combinação py2exe + PyQt muito bem (e, py2exe não ajuda em nada com embalagens multi-plataforma). PyInstaller parece ser muito melhor - os documentos em http://www.pyinstaller.org/ são velhos , mas o tronco svn é muito mais recente. Alguns documentos estão em lâminas dadas na recente conferência PyCon Italia Tre - http://www.pycon.it/static/stuff/slides/distribuire-programmi-python-con-pyinstaller.pdf - e, as lâminas são em Inglês, e conter a atual -mail do mantenedor, então eles devem ajudar! (E, vamos todos átrio do mantenedor atual para atualizar os documentos ... -!)

Tente adicionar um arquivo qt.conf para o diretório da sua exe, para dizer qt onde encontrar binários e plugins.

Algo como as seguintes obras para o caso simples, onde você só despejar todo dll no mesmo dir como o exe:

[Paths]
Prefix = .
Plugins = .

Update: Em seguida, copie os seus plugins de conteúdo (o ImageFormat / sqldriver diretórios etc) para o exe dir. Eu não acho que você pode carregar plug-in DLLs a partir do mesmo diretório que o exe. Consulte Qt plug-in doc para obter detalhes sobre subdiretórios plugon. (Ou, deixar de fora os 'plugins =.' E copiar os plugins dir à dir exe, então você tem /plugins/imageloaders/qjpeg4.dll).

Etienne - Obrigado pela dica. Depois de muita leitura e tentativa-e-erro, cheguei à mesma conclusão: PIL uso para mostrar jpegs em um aplicativo gerado pelo py2app

.

http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously-i-dont-know-what- to-do-com-você-quando-youre-como-presente /

O que eu acho é que as soluções propostas para py2exe / Windows não se aplica necessariamente a py2app / OSX.

Eu estou em OSX Leopard. Vamos supor que você tem um MyApp.app aplicação.

  • Coloque o libqjpeg.dylib bibliotecas e libqgif.dylib em
    MyApp.app/Contents/plugins/imageformats/
  • Coloque isso no qt.conf em MyApp.app/Contents/resources/:

    [Paths]
    Prefix = .
    Binaries = .
    

Na minha máquina (Leopard) isso funciona.

Depois de tentar todas as soluções acima em vão, eu só acabou usando PIL para carregar minhas imagens. Desde que eu queria para converter essas imagens para uma textura em um widget OpenGL Qt, o resultado foi o mesmo se eu carregar a imagem usando Qt ou PIL. Ainda assim, eu estou perplexo que uma coisa tão básica como JPEGs de carregamento é tão complicado em uma biblioteca GUI bem conhecido e amplamente usado como Qt.

Eu tinha exatamente o mesmo problema. Fixa-lo usando este: http://mail.python.org /pipermail/python-list/2008-June/669374.html

  1. Copiar do Qt plugins para o diretório: $ YOUR_DIST_PATH / PyQt4 / plugins;
  2. Copiar qt.conf para seu diretório dist;
  3. Editar qt.conf, mudança Prefixo para ./PyQt4

Para mim, o problema foi resolvido apenas copiando o "qt.conf" para o diretório do executável.

Você pode encontrar o "qt.conf" em ... \ PythonXX \ Lib \ site-packages \ PyQt4 \ qt.conf.

Obrigado por ajuda.

Tudo acima falhou para mim até que eu percebi que eu era agregação o .exe (ou seja, eu tinha a opção "bundle_files":. 2 no meu setup.py eu mudei para bundle_files = 2, e agora ele funciona muito bem.

As soluções acima são muito bem. Especificamente, eu adicionei a seguinte linha no meu setup.py: data = [( "imageformats", glob.glob ( "C: \ Python26 \ Lib \ site-packages \ PyQt4 \ plugins \ imageformats * .dll"))]

(além de outros arquivos, é claro).

Em seguida, as DLLs imagem de carregamento estão em MY_EXE_DIR / imageformats

Eu não preciso de um qt.conf para fazer este trabalho, embora eu tenho certeza que você poderia usá-lo se você quer manter sua árvore de diretórios menos desordenado.

É possível usar o plugin JPEG com um script py2exe'd, mesmo usando bundle_files. Você precisa organizar duas coisas para chegar a este trabalho corretamente:

  1. Copiar PyQt4 / plugins / imageformats para o diretório de py2exe saída (default: dist)

    Você só tem que copiar os formatos que você realmente precisa.

  2. Ao usar a opção bundle_files você precisa execlude os arquivos DLL Qt do zipfile usando a opção --dll-excludes para pyexe.

    Você ainda tem que copiar o Qt DLLs no diretório de saída de alguma outra forma (como usando a opção data_files).

no Windows, as soluções sugeridas funcionar perfeitamente.

No entanto, no OSX não pode fazê-lo funcionar, mesmo com as instruções aqui acima.

pergunta é: os arquivos libqjpeg.dylib e libqgif.dylib estão localizados no diretório /Developer/Applications/Qt/plugins/imageformats/, e que se você tiver instalado em si Qt, não apenas PyQt. esses arquivos não trabalho para mim.

na distribuição PyQt, eu ver a libqjpeg.bundle arquivos e libqgif.bundle em /opt/local/libexec/qt4-mac/plugins/imageformats/, no entanto estes não são bibliotecas, e btw eu não posso abrir seus conteúdos, quer, mesmo que tenham a extensão .bundle. usando esses arquivos em vez não quer trabalhar.

Estou curioso para saber o que você tem feito para fazê-lo funcionar no OSX. i ter instalado PyQt seguinte este guia .

Obrigado por suas respostas úteis para a questão! Eu encontrei mesmo problema que você fez e nenhuma solução poderia ajudar. Felizmente, eu estava usando VCS e descobriu que versão antiga do meu aplicativo carregado imagens JPEG corretamente e novas versões parou de fazê-lo. Eu peguei esse bug usando PySide v1.2.2 .

Para permitir bibliotecas de carregamento, I usado a mesma solução como @Macke fez (isto é adicionado e editado qt.conf).

Meu qt.conf foi em seguida:

[Paths]
Binaries = .
Plugins = qtplugins

C:\Python27\Lib\site-packages\PySide\plugins directory foi copiado para o diretório qtplugins, então eu tive próximos diretórios:

qtplugins\accessible
qtplugins\codecs
qtplugins\graphicssystems
qtplugins\iconengines
qtplugins\imageformats

Eu tive próximo código:

class NotesCalendar(QtGui.QCalendarWidget):
    note_icon = QtGui.QImage("res/16note.png")

Movimentação variável de classe NotesCalendar.note_icon ao construtor resolveu o problema e Qt começaram a carregar suas bibliotecas corretamente. Parece que o construtor variável de classe interrompido algumas coisas PySide interno.

Ele funciona sem problemas no Windows. Especificando qt.conf correta e copiando diretório plugins é suficiente para ativar o suporte JPEG em py2exe + PySide construção. Claro, você não deve ter problemas em seu próprio código.

Espero que isso irá salvar alguém um dia! ;)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top