wxPython Programme internationalisieren und py2exe

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

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,
Gruß!
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

was ist denn der Wert von 'wx.LANGUAGE_DEFAULT'?
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

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!
Gruß!
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

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__))
Antworten