2010-12-10 10 views
-1

Ich habe eine GUI-Anwendung in Python mit PyGTK geschrieben und möchte sie als ausführbare Datei verteilen, für die ich py2exe verwende. Wenn ich mein Programm laufen lasse, erhalte ich die folgende WarnungAnzeigen von Bildern in einem py2exe'd PyGTK-Programm

GdkPixbuf-WARNING **: Cannot open pixbuf loader module file 'gtk-2.0\gdk-pixbuf.loaders': No such file or directory 

und meine Bilder nicht angezeigt werden, obwohl dist\etc\gtk-2.0\gdk-pixbuf.loaders existiert.

Wie kann ich mein Programm als Windows exe verpacken und diese Imagines verwenden?

+0

Ich bin mir nicht sicher, aber ich vermute, dass Sie gtk-2.0 auf dem System installieren müssen. http://www.gtk.org/download-windows.html –

+0

@Aaron, gtk-2.0 ist auf dem System installiert. –

Antwort

0

Wenn Sie py2exe verwenden, müssen Sie gtk packen + (etc, geteilt, lib) in Ihrem Projekt auf dem gleichen Niveau Ihrer exe:

Struktur Beispielverzeichnis:

PROGRAM.exe 
LOT_OF_PYD_AND_LIB_FILES... 
etc 
etc\fonts 
etc\gtk-2.0 
etc\pango 
lib 
lib\gtk-2.0 
share 
share\aclocal 
share\glib-2.0 
share\locale 
share\themes 

Haben Sie diese Verzeichnisstruktur?

+0

Ich glaube nicht, dass das eine Voraussetzung für die meisten py2exe-Apps ist, aber ich habe weiterhin das Problem mit dieser Struktur. –

0

Die Standardantwort des Kopierens GTK + 's ist, etc, zu teilen und lib Verzeichnis des dist-Verzeichnis der Projektes korrekt ist (aber ich sehe jemand mutwillig zerstört hat [1] und ist wird aus der Liste fehlt), immerhin:

  • PyGTK nichts anderes als eine dünne Schicht Kleber ist + machen GTK Python verfügbar
  • pygobject ist nichts anderes als eine dünne Schicht Kleber machen GObject, GIO, ... zu Python verfügbar
  • PyCairo ist nichts anderes als eine dünne Schicht Kleber machen Kairo

auf einem Minimum zu Python verfügbar, können Sie alle drei dieser Bindungen Pakete und aufgrund ihrer Natur brauchen sie sind nutzlos, wenn die zugrunde liegende Plattform nicht ist verfügbar (.dll-Dateien, Konfigurationsdateien, kurz: der ganze Shebang). Deshalb müssen GTK + bin, etc, share und lib in das Verzeichnis dist des Projekts kopiert werden.

Das setup.py-Fragment, das ich vor ein paar Jahren zu [1] gepostet habe, ist jedoch subtil unvollständig. Die richtige Version hätte sein müssen:

from distutils.core import setup 
import py2exe 

setup(
    name = 'handytool', 
    description = 'Some handy tool', 
    version = '2.0', 
    zipfile = 'bin/library.zip', 
    windows = [{'script': 'handytool.py', 
       'dest_base': 'bin/handytool'} 
       ], 

    options = {'py2exe': {'packages':'encodings', 
          'includes': 'glib, gio, gobject, cairo, atk, pango, pangocairo, gtk'} 
       } 
) 

Beachten Sie die Werte für zipfile und dest_base. Mit diesen Optionen Ihre .exe, eine Reihe von .pyd-Dateien und library.zip werden alle in py2exe das dist/bin-Verzeichnis erstellt. Dann, wenn Sie die Verzeichnisse von GTK + in das Verzeichnis von py2exe kopieren, lebt Ihre ausführbare Datei direkt neben libgtk-win32-2.0.0.dll und so weiter wie es sein sollte. Wenn Sie dies nicht tun, kann eine falsch konfigurierte PATH-Umgebungsvariable die (manchmal inkompatiblen) .dll-Dateien beeinträchtigen, die Ihre py2exe'd-Programmdatei lädt.

Also für die obige Einrichtung.py-Datei, die richtige Verzeichnisstruktur dist sollte wie folgt aussehen:

bin/handytool.exe 
bin/library.zip 
bin/*.pyd (all .pyd files py2exe deemed needed) 
bin/* (complete copy of GTK+ runtime bin dir) 
etc/* (complete copy of GTK+ runtime etc dir) 
share/* (complete copy of GTK+ runtime share dir) 
lib/* (complete copy of GTK+ runtime lib dir) 

Wenn Sie die oben erhalten korrekt arbeiten werden Sie feststellen, dass das Laden von Bildern finden funktioniert einfach und Sie können einige Teile über Weglassen nachzudenken share/(wie die Übersetzung Dateien, die Sie nicht wollen/müssen) usw.

MVG, Dieter

[1] http://www.py2exe.org/index.cgi/Py2exeAndPyGTK

Edit 05.07.2011: Die Includes-Option für PyGObject 2.28/PyGTK 2.24 wurde korrigiert. Wenn Sie nur PyGObject 2.28 verwenden, enthält die Option includes 'glib, gio, gobject'. Wenn Sie PyGTK verwenden, dann braucht es: 'glib, gio, gobject, kairo, atk, pango, pangocair, gtk'.