10 Stimmen

Aktivieren der JPEG-Unterstützung für QImage in py2exe-kompilierten Python-Skripten?

Ich versuche, ein JPEG-Bild in einem QImage-Objekt von einem Python-Skript, mit PyQt4 zu verwenden.

Das Skript selbst funktioniert einwandfrei, das Bild wird geladen, kann bearbeitet und gerendert werden und so weiter. Wenn ich jedoch versuche, dieses Skript mit py2exe zu "kompilieren", funktioniert alles außer dem JPEG-Bild. Wenn ich es durch ein PNG-Äquivalent ersetze, funktioniert es, aber da mein Programm Bilder aus dem Internet herunterlädt, werden sie nicht immer im PNG-Format sein und ich kann es mir nicht leisten, sie alle mit einer anderen Bibliothek zu konvertieren.

Ich habe entdeckt, dass JPEG-Bildunterstützung für QImage, zusammen mit anderen Bildformaten, von einigen DLLs in der \qt\plugins\imageformats Verzeichnis (sie heißen qjpeg4.dll und qjpeg4d.dll). Ich glaube, ich muss sie irgendwie in meiner ausführbaren Datei verwenden, aber ich weiß nicht, wie. Ich habe versucht, sie einfach in mein exe-Verzeichnis zu kopieren, ohne Erfolg. Ich habe versucht, als hier angegeben Ich habe versucht, diese Dateien als data_files in das setup.py-Skript einzubinden, aber ohne Erfolg (es sieht so aus, als ob es diese Dateien nur in das Verzeichnis der Exe kopiert, also ändert sich nichts gegenüber dem manuellen Kopieren der Dateien).

Ich bin sicher, es gibt eine Handvoll von Anwendungen da draußen mit PyQt mit JPEG-Bildern, wie tun sie es tun? Es schien wie eine triviale Aufgabe, aber ich bin auf es jetzt stecken.

Außerdem möchte ich, dass meine Anwendung plattformübergreifend ist (warum sollte ich sonst in Python programmieren?), und ich hoffe, dass ich bei der Paketierung für OS X oder Linux nicht auf solche Probleme stoße (es ist nicht das einzige). Werde ich das?

14voto

jbz Punkte 156

Nachdem ich stundenlang mit dem gleichen Problem herumgestolpert bin, möchte ich die Lösung mitteilen, die bei mir unter Windows Vista funktioniert hat: python2.6 verwenden

kopieren Sie das folgende Verzeichnis in Ihr von py2exe erzeugtes dist-Verzeichnis:

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

Ich habe einfach das imageformats-Verzeichnis direkt in mein dist-Verzeichnis gelegt, ohne weitere Änderungen an der qt.conf oder ähnlichem. Ich habe es nicht ausprobiert, aber das könnte auch für phonon funktionieren.

1voto

AteYourLembas Punkte 303

Etienne - Danke für den Hinweis. Nach viel Lesen und Ausprobieren bin ich zu demselben Schluss gekommen: PIL verwenden, um jpegs in einer von py2app generierten App anzuzeigen.

http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously-i-dont-know-what-to-do-with-you-when-youre-like-this/

Ich vermute, dass die vorgeschlagenen Lösungen für py2exe/Windows nicht unbedingt auf py2app/OSX zutreffen.

1voto

Ich benutze OSX Leopard. Nehmen wir an, Sie haben eine Anwendung MyApp.app .

  • Legen Sie die Bibliotheken libqjpeg.dylib et libqgif.dylib in
    MyApp.app/Contents/plugins/imageformats/
  • Legen Sie das ein qt.conf において MyApp.app/Contents/resources/ :

    [Paths]
    Prefix = .
    Binaries = .

Auf meinem Rechner (Leopard) funktioniert das.

1voto

Alex Martelli Punkte 805329

Ich muss gestehen, dass ich die Kombination py2exe + pyqt nie richtig hinbekommen habe (und py2exe hilft bei der plattformübergreifenden Paketierung überhaupt nicht). PyInstaller scheint viel besser zu sein - die Dokumentation unter http://www.pyinstaller.org/ sind alt, aber der svn-Stamm ist viel aktueller. Einige Dokumente sind in Folien, die auf der letzten Pycon Italia Tre Konferenz gezeigt wurden -- http://www.pycon.it/static/stuff/slides/distribuire-programmi-python-con-pyinstaller.pdf -- und, die Folien sind in Englisch und enthalten die E-Mail des aktuellen Maintainers, also sollten sie helfen! (Und, lasst uns alle den aktuellen Betreuer dazu bringen, die Dokumente zu aktualisieren...!-)

1voto

Macke Punkte 23640

Versuchen Sie, eine qt.conf Datei in das Verzeichnis Ihrer Exe, um qt mitzuteilen, wo die Binärdateien und Plugins zu finden sind.

Für den einfachen Fall, dass Sie einfach alle DLLs in das gleiche Verzeichnis wie die Exe auslagern, funktioniert etwas wie das Folgende:

[Paths]
Prefix = .
Plugins = .

Update: Kopieren Sie dann Ihre Plugin-Inhalte (die Verzeichnisse imageformat/sqldriver usw.) in das exe-Verzeichnis. Ich glaube nicht, dass man Plugin-Dlls aus dem gleichen Verzeichnis wie die Exe laden kann. Siehe Qt-Plugin-Dokument für Details zu Plugon-Unterverzeichnissen. (Oder lassen Sie das 'plugins = .' weg und kopieren Sie das plugins-Verzeichnis in das exe-Verzeichnis, so dass Sie /plugins/imageloaders/qjpeg4.dll haben).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X