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?

0voto

Ronald Oussoren Punkte 2565

Es ist möglich, das JPEG-Plugin mit einem py2exe-Skript zu verwenden, auch mit bundle_files. Sie müssen zwei Dinge einrichten, damit dies richtig funktioniert:

  1. Kopieren Sie PyQt4/plugins/imageformats in das Ausgabeverzeichnis von py2exe (Standard: dist )

    Sie müssen nur die Formate kopieren, die Sie tatsächlich benötigen.

  2. Wenn Sie die Option bundle_files verwenden, müssen Sie die Qt dll-Dateien aus der Datei zip-Datei mit der Option --dll-excludes Option für pyexe.

    Sie müssen die Qt DLLs noch auf andere Weise in das Ausgabeverzeichnis kopieren (z.B. mit durch Verwendung der data_files Option).

0voto

metamaker Punkte 2037

Vielen Dank für Ihre hilfreichen Antworten auf die Frage! Ich bin auf das gleiche Problem gestoßen wie Sie und keine Lösung konnte helfen. Hoffentlich habe ich VCS verwendet und festgestellt, dass die alte Version meiner Anwendung JPEG-Bilder korrekt geladen hat und die neuen Versionen dies nicht mehr tun. Ich habe diesen Fehler mit PySide gefunden v1.2.2 .

Um das Laden von Bibliotheken zu ermöglichen, habe ich die gleiche Lösung wie @Macke verwendet (d.h. qt.conf hinzugefügt und bearbeitet).

Meine qt.conf war die nächste:

[Paths]
Binaries = .
Plugins = qtplugins

C:\Python27\Lib\site-packages\PySide\plugins directory wurde kopiert nach qtplugins Verzeichnis, also hatte ich die nächsten Verzeichnisse:

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

Ich hatte den nächsten Code:

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

Variable Klasse verschieben NotesCalendar.note_icon zum Konstruktor löste das Problem und Qt begann, seine Bibliotheken korrekt zu laden. Es scheint, dass der Klassenvariablenkonstruktor einige interne PySide-Sachen unterbrochen hat.

Es funktioniert ohne Probleme unter Windows. Angabe der korrekten qt.conf und Kopieren plugins Verzeichnis reicht aus, um die JPEG-Unterstützung in py2exe + PySide bauen. Natürlich dürfen Sie keine Probleme in Ihrem eigenen Code haben.

Ich hoffe, dass dies jemandem den Tag retten wird ;)

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