Seite 1 von 1

And now for something completely different ;)

Verfasst: Montag 15. Mai 2006, 00:29
von STiGMaTa_ch
Hallo liebe Monty Fans ;-)

Da es in anderen Foren - in denen ich lesend und schreibend zugegen bin - üblich ist sich als Neuling kurz vorzustellen, werde ich das hiermit mal kurz tun. (P.s. wen das nicht interessiert; weiter unten stelle ich sogar noch einige Fragen :mrgreen:)

Also angefangen hat alles vor zwei Wochen :D . Ich war gerade dabei dosbox auf die neuste Version upzudaten, als ich mit schrecken feststellen musste, dass mein bisher verwendetes Frontent D-Fend nun endgueltig nicht mehr mit dosbox klarkommt.

Faul wie ich bin, habe ich mich nach Alternativen umgeschaut, jedoch keine brauchbare gefunden. Was blieb mir also anderes uebrig als die Finger aus dem allerwertesten rauszunehmen und selber was zu basteln? Nur womit, war die Frage. Meine Programmierkentnisse beschränkten sich auf Prozedurales Scripten (Bash, Awk, HTML, PHP etc.)?

Nach ein wenig stöbern bin ich dann auf Python gestossen. Um es kurz zu machen, letztes Weekend habe ich "A Byte of Python" durchgeackert und anfangs letzter Woche habe ich mir die PDF Version von wxPython in Action gekauft, dass ich heute durchgelesen habe .oO(Stoehn :twisted: )

Bisher habe ich also ~1000 Seiten Python/wxPython Erfahrung, ein Grobkonzept für das dosbox Frontend aber noch keine einzige Zeile Python Code geschrieben :oops:

Und bevor ich allzugrossen Mist zusammenprogrammiere, habe ich mich in diesem Forum angemeldet. Natürlich in der Hoffnung, dass Ihr mir bei meinen Fragen und Codeschnippseln jeweils links und rechts eines mit den Zaunpfählen reindonnert :)

So, und damit es nicht heisst ich lasse andere nicht zu Worte kommen, gleich einige Fragen an euch, die Ihr mir vielleicht gleich zu Beginn beantworten könntet...

1.) Wie handhabt Ihr das in diesem Forum mit Fragen? Eine Frage pro Thread oder kann man auch mehrere stellen (Ich gehe jetzt mal ganz frech von letzterem aus, sonst muesste ich jetzt ja gleich einen neuen Thread starten).

2.) Mein Frontend soll unter Windows wie auch unter Linux lauffähig sein. Gibt es ausser der unterschiedlichen Handhabung von Pfadnamen noch andere Dinge die ich bei der Programmierung beachten muss?

3.) Das Frontend soll Multilingual werden. Was haltet ihr von meinem Ansatz alles was irgend etwas "Wortaehnliches" enthaelt jeweils in eine eigene Variable zu packen und all diese Variablen in eine eigene Klasse zu packen? Im eigentlichen Programm würde ich dann von der jeweiligen Sprachklasse ein Instanz erstellen und dann mit dieser Instanz arbeiten.

Zum besseren Verständnis ein Dummy Beispiel:

sprachtest_import.py

Code: Alles auswählen

# Test: Die folgende Klasse enthaelt nur Variabeln fuer die Sprache...

class DELanguageStrings:
    def __init__(self):
        self.hello = 'Ich bin der "hallo" String'
        self.error = 'Ich bin der "error" String'

class ENLanguageStrings:
    def __init__(self):
        self.hello = 'I\'m the "hello" String'
        self.error = 'I\'m the "error" String'
sprachtest_execute.py

Code: Alles auswählen

#!/usr/bin/python

import sprachtest_import

# Normalerweise wuerde man nur einen instanzieren, zur
# Demonstration instanziere ich jedoch beide Sprachen.
brabbel = sprachtest_import.DELanguageStrings()

print brabbel.hello
print brabbel.error

# Und jetzt auf Englisch
brabbel = sprachtest_import.ENLanguageStrings()

print brabbel.hello
print brabbel.error
Oder würdet ihr das gänzlich anders lösen?

4.) Fuer den Aufbau einer Konfigurationsdatei habe ich mir in etwa folgendes Schema vorgestellt:
[grafik]
breite=1024
hoehe=768
farbtiefe=32

[sound]
emulation=soundblaster
irq=7
dma=1
Wie lese ich nun eine Sektion (z.B. grafik) am einfachsten mit Python aus? Unter Linux haette ich jetzt nach allen Zeilen gegreppt welche mit "[" beginnen und haette mir die Zeilennummern ausgeben lassen. Danach haette ich anhand der Zeilennummer von [sound] eine "von Zeile [grafik]+1 bis Zeile [sound]-1" abgrenzung gebastelt.

Aber unter Python wird das doch sicherlich viel eleganter gehen. Hat mir da vielleicht jemand einen Zauhnpfahl übrig? Er darf auch winken damit :D

5.) Kennt vielleicht jemand eine Seite (Englisch oder Deutsch) welche sich mit "Probleme und deren Lösungen" befasst? Also in der Art:
F: Ich erstelle eine Liste mit 4000 Eintraegen, wie kann ich die Initialisierung beschleunigen und weniger RAM verbrauchen?
A: Verwende virtuelle Listen, hier ein Beispiel.

oder

F: Wie erstelle ich einen Wizard für meine Applikation?
A: Hier ein Beispiel Programm dass die Wizard Klasse von wxPython nutzt.

etc..

So, genug der Fragen sonst schmeisst ihr mich noch raus bevor ich ueberhaupt richtig heimisch werden kann hier ;-)

Lieber Gruss
STiGMaTa

Re: And now for something completely different ;)

Verfasst: Montag 15. Mai 2006, 06:38
von BlackJack
STiGMaTa_ch hat geschrieben:1.) Wie handhabt Ihr das in diesem Forum mit Fragen? Eine Frage pro Thread oder kann man auch mehrere stellen (Ich gehe jetzt mal ganz frech von letzterem aus, sonst muesste ich jetzt ja gleich einen neuen Thread starten).
Eigentlich ist ein Thread pro Frage, so sie denn inhaltlich nicht ganz nah beieinanderliegen, besser.
2.) Mein Frontend soll unter Windows wie auch unter Linux lauffähig sein. Gibt es ausser der unterschiedlichen Handhabung von Pfadnamen noch andere Dinge die ich bei der Programmierung beachten muss?
Bei Pfadnamen möglichst die plattformunabhängigen Funktionen in `os.path` benutzen.
3.) Das Frontend soll Multilingual werden. Was haltet ihr von meinem Ansatz alles was irgend etwas "Wortaehnliches" enthaelt jeweils in eine eigene Variable zu packen und all diese Variablen in eine eigene Klasse zu packen? Im eigentlichen Programm würde ich dann von der jeweiligen Sprachklasse ein Instanz erstellen und dann mit dieser Instanz arbeiten.
Für's "Internationalisieren" gibt's in der Standardbibliothek das `gettext` Modul. Schau Dir das mal an, bevor Du was eigenes bastelst.
4.) Fuer den Aufbau einer Konfigurationsdatei habe ich mir in etwa folgendes Schema vorgestellt:
[grafik]
breite=1024
hoehe=768
farbtiefe=32

[sound]
emulation=soundblaster
irq=7
dma=1
Wie lese ich nun eine Sektion (z.B. grafik) am einfachsten mit Python aus? Unter Linux haette ich jetzt nach allen Zeilen gegreppt welche mit "[" beginnen und haette mir die Zeilennummern ausgeben lassen. Danach haette ich anhand der Zeilennummer von [sound] eine "von Zeile [grafik]+1 bis Zeile [sound]-1" abgrenzung gebastelt.
Auch dafür hält die Standardbibliothek etwas bereit: `ConfigParser`

Code: Alles auswählen

from ConfigParser import ConfigParser

config = ConfigParser()
config.read('test.ini')
print config.getint('grafik', 'farbtiefe')

Re: And now for something completely different ;)

Verfasst: Montag 15. Mai 2006, 08:06
von gerold
Hi STiGMaTa!

Willkommen im Python-Forum. :-)
STiGMaTa_ch hat geschrieben:...dass Ihr mir bei meinen Fragen und Codeschnippseln jeweils links und rechts eines mit den Zaunpfählen reindonnert :)
An dem wird es sicher nicht scheitern. ;-)
STiGMaTa_ch hat geschrieben:Wie handhabt Ihr das in diesem Forum mit Fragen?
Eine Frage pro Thread wäre nicht schlecht. So findet man später auch schneller Lösungen wenn man danach sucht. Ein aussagekräftiger Titel je Frage wirkt da Wunder.
STiGMaTa_ch hat geschrieben:Gibt es ausser der unterschiedlichen Handhabung von Pfadnamen noch andere Dinge die ich bei der Programmierung beachten muss?
Ja natürlich. Es gibt einiges das nur unter den jeweiligen Betriebssystemen läuft. Die entsprechenden Module und Funktionen sind aber dementsprechend gekennzeichnet. http://python.org/doc/2.4.3/modindex.html Du kannst also unter Linux nicht auf die Registry zugreifen und unter Windows hast du keinen Zugriff auf /etc/passwd. Auf welche Unterschiede du achten musst, kommt zu sehr auf das Programm an, das du schreiben möchtest. Am Besten, du fragst dann wenn es so weit ist.
STiGMaTa_ch hat geschrieben:Das Frontend soll Multilingual werden.
gettext

http://python.org/doc/2.4.3/lib/module-gettext.html
http://wiki.wxpython.org/index.cgi/Inte ... gettext%29
http://wiki.wxpython.org/index.cgi/poEd ... gettext%29
STiGMaTa_ch hat geschrieben:Konfigurationsdatei
ConfigParser

http://python.org/doc/2.4.3/lib/module- ... arser.html

Viel Vergnügen mit Python und wxPython,
Gerold
:-)

Verfasst: Montag 15. Mai 2006, 22:12
von STiGMaTa_ch
Hallo gerold und BlackJack

Danke für eure Tipps. Damit bin ich wieder ein weilchen versorgt.
gettext und ConfigParser wollen von mir erforscht werden ;-)

Lieber Gruss
STiGMaTa

Verfasst: Montag 15. Mai 2006, 22:36
von Martin89
Fuer dein Sprach modul solltest du meiner Meinung nach Polymorphie verwenden, falls du schon etwas gehoert hast.
sprachtest_import.py

Code: Alles auswählen

# Test: Die folgende Klasse enthaelt nur Variabeln fuer die Sprache...
class LanguageStrings:
    hello= ""
    error= ""

    def printHello( self ):
        print self.hello

    def printError( self ):
        print self.error

class DELanguageStrings( LanguageStrings ):
    def __init__(self):
        self.hello = 'Ich bin der "hallo" String'
        self.error = 'Ich bin der "error" String'

class ENLanguageStrings( LanguageStrings ):
    def __init__(self):
        self.hello = 'I\'m the "hello" String'
        self.error = 'I\'m the "error" String'
sprachtest_execute.py

Code: Alles auswählen

#!/usr/bin/python

import sprachtest_import

# Normalerweise wuerde man nur einen instanzieren, zur
# Demonstration instanziere ich jedoch beide Sprachen.
brabbel = sprachtest_import.DELanguageStrings()

brabbel.printHallo()
brabbel.printError()

# Und jetzt auf Englisch
brabbel = sprachtest_import.ENLanguageStrings()

brabbel.printHello()
brabbel.printError()
Kein groszer Unterschied. Ein Programmierlehrer wuerde es gut finden ...

Verfasst: Dienstag 16. Mai 2006, 09:14
von gerold
Martin89 hat geschrieben:Fuer dein Sprach modul solltest du meiner Meinung nach Polymorphie verwenden
[...]
Ein Programmierlehrer wuerde es gut finden
Hi Martin89!

Sorry, aber ein Praktiker würde es sofort gegen "gettext" tauschen.

Gettext hat den Vorteil, dass es schon ziemlich ausgereift ist.

Mit folgendem Code, wird ein Text zum Übersetzen markiert:

Code: Alles auswählen

print _("Hallo Welt")
Mit dem Programm pygettext kannst du deinen Quellcode nach zu übersetzenden Strings durchsuchen lassen. Du bekommst dann eine Übersetzungsvorlage, die von sehr vielen Übersetzern verwendet werden kann, da gettext ziemlich oft eingesetzt wird und sich bereits bewährt hat.

Ein Übersetzer schnappt sich also die Vorlage und erstellt für eine Sprache eine Datei mit den übersetzen Strings. Diese kommt in einen dafür gekennzeichneten Ordner und schon ist das Programm übersetzt. Da muss nichts mehr am Quellcode verändert werden.

Jede Übersetzung ist einfach nur eine Textdatei mit den Strings in einer eigens dafür vorgesehenen Struktur.

Ändert sich etwas am Programm, muss nur die Vorlage neu erstellt werden. Viele Übersetzungsprogramme vergleichen die alte und die neue Vorlage und erledigen das Meiste automatisch. Als Übersetzer, musst du also nur die neuen Strings übersetzen. Undsoweiter...

Wie ich schon schrieb. -- Gettext ist ziemlich ausgereift und die Übersetzungsprogramme die es dafür gibt sind es auch. Warum soll ich dann etwas schaffen, das zwar den Text übersetzt, es aber nicht unbedingt einfacher macht. Bei deiner Methode, müsste ich als Programmierer sogar die Klassenattribute für den Zugriff auf die Strings im Kopf behalten. Das will ich mir bei Programmen mit mehreren 1000 Codezeilen aber nicht unbedingt antun. Da markiere ich meine Strings doch lieber mit _() und die Sache ist gegessen.

mfg
Gerold
:-)

Verfasst: Donnerstag 18. Mai 2006, 06:43
von STiGMaTa_ch
Hallo zusammen

Ich habe mich durch die ConfigParser und gettext Klassen durchgearbeitet. War nicht gnaz leicht, aber ich habe tatsächlich funktionierende Beispielprogramme hinbekommen. 8)

Ein kleines Problem habe ich jedoch noch mit gettext.

Zum testen habe ich mal ein Dummy Programm mit Deutschem Text erstellt. Die Textstrings habe ich dann in Schweizerdeutsch uebersetzt. Soweit so gut.

Mit nachfolgendem Code wird mir auch der Schweizerdeutsche Text angezeigt:

Code: Alles auswählen

lang1 = gettext.translation('language_test', "H:\\Python\\frodobox\\", languages=['ch'])

# Mit diesem Befehl wird die Sprache schlussendlich installiert.
lang1.install()

print 'Dieser Text wird nicht translated'
print _('Dies ist ein uebersetzter text.')
print _('Fehlermeldung')
Die Frage ist nun jedoch, wie kann ich wieder deutschen Text anzeigen? Bis jetzt ist mir nur die Idee gekommen einfach ein Sprachfile mit Deutschem Text zu erstellen. Aber ob das der richtige Weg ist weiss ich nicht...

Lieber Gruss
STiGMaTa

Verfasst: Donnerstag 18. Mai 2006, 07:44
von gerold
STiGMaTa_ch hat geschrieben:wie kann ich wieder deutschen Text anzeigen? Bis
Hi STiGMaTa!

Code: Alles auswählen

lang1 = gettext.translation(
    'language_test', 
    "H:\\Python\\frodobox\", 
    languages=['de'], 
    fallback = True
)
Durch **fallback = True** gibt es keinen Fehler, wenn eine Sprachdatei nicht existiert, sondern es wird der Originaltext verwendet.

mfg
Gerold
:-)

Verfasst: Donnerstag 18. Mai 2006, 13:33
von Joghurt
In der Regel sollte der Originaltext übrigens Englisch sein; so hast du mehr potenzielle Übersetzer; es sprechen mehr Spanier Englisch als Deutsch

Verfasst: Donnerstag 18. Mai 2006, 16:33
von STiGMaTa_ch
@gerold
Ahso... Und ich dachte, mit fallback wird definiert, dass genau diese Language als Fallbacksprache gewaehlt werden soll. Danke für den Tipp!

@Joghurt
Danke für den Hinweis. Ich werde aber trotzdem zuerst Deutsch verwenden, damit ich mich zu Beginn vollends auf das coden konzentrieren kann. Wenn Frodobox das Licht der Welt erblickt und funktionstüchtig ist, werde ich den Code auf english konvertieren, damit auch andere was davon haben ;-)

Lieber Gruss
STiGMaTa