Seite 1 von 1

wxPython Programme internationalisieren und py2exe

Verfasst: Donnerstag 29. Juli 2010, 12:57
von C4S3
Hallo!

Gerade bin ich hier auf der Arbeit dabei, ein kleines Programm zu erstellen, für dessen GUI ich wxPython benutze. Als weitere Abhängigkeit habe ich PIL. Soweit hat alles sehr gut funktioniert, nur wollen unsere Aussentellen in den nicht deutschsprachigen Ländern das nun auch benutzen. Freut mich ja grundsätzlich, nur habe ich dort überall das Problem, dass keine Python installation (von den Abhängigkeiten wxPython und PIL ganz zu schweigen) vorhanden ist. :(
Ich werde also genötigt, py2exe zu verwenden, um Pakete zu erstellen.

Um die GUI zu internationalisieren habe ich mich an Gerolds überaus geniales Tutorial gehalten, was so auch sehr gut funktioniert. Hier also ein großes Lob und ein Danke.
Hier der Link zum Tutorial: http://www.halvar.at/python/wxpython_in ... alisieren/

Wie gesagt, bei mir auf der Maschine (Windows XP SP3, Python 2.5.4, wxPython 2.8.10.1 msw-unicode, PIL 1.1.7) funktioniert das jetzt auch einwandfrei. Das Programm startet, meine GUI erscheint in Deutsch. Ich hab's auch kurz mit Mint Linux 9 unter Gnome getestet, dort funktioniert das ganze ebenfalls.
Die Ordnerstruktur ist wie in Gerolds Tutorial beschrieben:

Code: Alles auswählen

PROGRAMMVERZEICHNIS
| -> .WorkTool.py
| -> .*.py
|
|--- locale
     |
     |--- en
     |    |
     |    |--- LC_MESSAGES
     |             |
     |             |--> WorkTool.mo
     |
     |--- de
           |
           |--- LC_MESSAGES
                   |
                   |--> WorkTool.mo
Beim starten des Programms verwende ich folgenden Code (funktionierendes, aber gekürztes Beispiel. Übersetzungsdaten fehlen natürlich):

Code: Alles auswählen

import wx
from wx.lib.wordwrap import wordwrap
import os
import sys

APPDIR = os.path.dirname(os.path.abspath(__file__))
LOCALDIR = os.path.join(APPDIR, "locale")
LOCALDOMAIN = "WorkTool"

wx.SetDefaultPyEncoding("utf-8")
_ = wx.GetTranslation

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.panel = wx.Panel(self, -1)
        
        self.labeltext = _("This is the text of the Label")
        
        self.label = wx.StaticText(self.panel, -1, self.labeltext, pos=(10,10))
        
        print "Appdir: ", APPDIR
        print "Locale Dir: ", LOCALDIR
        print "Locale Domain: ", LOCALDOMAIN
        
        # More widgets here
        # ...
        
class MyApp(wx.App):
    def OnInit(self):
        self.locale = wx.Locale(wx.LANGUAGE_DEFAULT)
        self.locale.AddCatalogLookupPathPrefix(LOCALDIR)
        self.locale.AddCatalog(LOCALDOMAIN)
        
        wx.InitAllImageHandlers()
        self.frameMain = MyFrame(None, -1, "")
        self.SetTopWindow(self.frameMain)
        self.frameMain.Show()
        return 1

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()
Nun zum Problem (bitte entschuldigt die ausschweifende Erklärung, ich möchte nur nichts übersehen):
Ich habe mit Py2exe ein Paket geschnürt, die Anwendung funktioniert soweit auch (alle Funktionen), nur mit der Lokalisation scheint etwas nicht zu stimmen. Die Anwendung erscheint nicht in der jeweiligen Landessprache, sondern nur in Englisch.

Daher meine Frage:
Weiß jemand, warum die Lokalisierung jetzt nicht mehr funktioniert, bzw. wie man sie wieder zum Laufen bringt?
Für jeden Hinweis wäre ich sehr dankbar.

Viele Grüße,

Re: wxPython Programme internationalisieren und py2exe

Verfasst: Donnerstag 29. Juli 2010, 18:11
von DaMutz
was ist denn der Wert von 'wx.LANGUAGE_DEFAULT'?

Re: wxPython Programme internationalisieren und py2exe

Verfasst: Sonntag 1. August 2010, 23:08
von C4S3
was ist denn der Wert von 'wx.LANGUAGE_DEFAULT'?
Es ist ein Integer, der "0" ist.
Aber ich denke, ich bin dem Problem auf der Spur. Mittlerweile habe ich herausgefunden, dass die Zeile

Code: Alles auswählen

APPDIR = os.path.dirname(os.path.abspath(__file__))
ein Grund für das komische Verhalten zu sein scheint. Ein Paket, dass mit Py2Exe erstellt wurde, hat damit offenbar probleme, bzw. der Pfad ist dann anders, als wenn ich die Datei ganz normal starte.
Ich hab's jetzt mal durche ein os.getcwd() ersetzt, so funktioniert es, wenn ich auch irgendwie ein wenig Bauchweh mit der "Lösung" habe, zumal ich ein Programm ja auch von wo anders aus starten kann.
Zumindest unter Linux funktioniert es so nun nicht mehr (so einfach) und ich muss erst in das Programmverzeichnis navigieren, damit das Programm läuft.

Sollte also noch jemand Hinweise haben, wäre ich sehr dankbar!

Re: wxPython Programme internationalisieren und py2exe

Verfasst: Montag 2. August 2010, 10:26
von ms4py
C4S3 hat geschrieben:Sollte also noch jemand Hinweise haben, wäre ich sehr dankbar!
Musst du denn unbedingt `py2exe` einsetzen? Ich würde eher auf eine portable Version von Python setzen, damit hatte ich noch nie Probleme und irgendwelche Seiteneffekte.

Achja, der Fehler ist logisch. Py2exe packt die Source-Dateien in die `library.zip`, dann stimmt selbstverständlich der Pfad nicht mehr.
Workaround wäre alternativ noch im aktuellen APPDIR und relativ ein Pfad weiter oben nach dem `locale` Ordner zu suchen.

Re: wxPython Programme internationalisieren und py2exe

Verfasst: Montag 2. August 2010, 11:52
von fhoech
py2exe setzt sys.frozen:

Code: Alles auswählen

import os, sys
APPDIR = os.path.dirname(sys.executable if getattr(sys, 'frozen', False) else os.path.abspath(__file__))