Lure of the Temptress Chooser

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
STiGMaTa_ch
User
Beiträge: 32
Registriert: Sonntag 14. Mai 2006, 22:58
Wohnort: Rueti ZH, Schweiz

Freitag 2. Mai 2008, 22:05

Hallo zusammen

Das Spiel Lure of the Temptress wurde von Revolution Software zum freien Download zur Verfügung gestellt. Da man das Spiel in Deutsch, Englisch, Französisch, Italienisch und Spanisch herunterladen und spielen kann, habe ich mir einen kleinen Chooser für Windows programmiert.

Mit dem Chooser kann man seine bevorzugte Sprache wählen, je nach Vorhandensein die Dokus (mit einem hoffentlich bereits installierten PDF Viewer) anschauen oder das Spiel durch den SCUMM Emulator direkt mit den richtigen Optionen ausführen lassen.

Bild

Beim erstellen des Programmes ging es mir Hauptsächlich darum, wxPython und Python besser kennen zu lernen. Das ganze Paket ist für Windows gemacht, da jemand der Linux verwendet wohl selber scumm installieren kann und das hier nicht braucht.

Das "spezielle" am Chooser sind die animierte Hintergrundanimation und der Sound, welcher abgespielt werden. Wer Interesse hat, das ganze Paket mal anzuschauen, der darf das von folgendem Link herunterladen (~23MB):

http://blog.matse.ch/files/LureChooser_setup.exe

Falls jemand nur am Source Code interessiert ist, kann ihn unter folgender Adresse herunterladen:

http://blog.matse.ch/files/LureChooser.pyw

Ueber Kritiken freue ich mich immer. Seid aber etwas nachsichtig mit mir. Es ist das erste mal, dass ich etwas in Python erstellt habe.

Lieber Gruss
STiGMaTa
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus. (André Kostolany)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 2. Mai 2008, 22:22

Nur mal kurz reingeschaut:

``"C"+u'\xf3'+"digos" == u"C\xf3digos"``, nicht nötig das so kompliziert zu zerlegen. Statt ``execvp`` würde ich eher zu ``subprocess`` raten.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
STiGMaTa_ch
User
Beiträge: 32
Registriert: Sonntag 14. Mai 2006, 22:58
Wohnort: Rueti ZH, Schweiz

Freitag 2. Mai 2008, 22:54

Leonidas hat geschrieben:``"C"+u'\xf3'+"digos" == u"C\xf3digos"``, nicht nötig das so kompliziert zu zerlegen.
Hüstel... tja, ich hatte derart massive Probleme die Zeichen darzustellen, dass ich irgendwann diese Form gewählt hatte und mich dabei nur noch auf die darzustellenden Zeichen fixiert hatte. Ich habe gar nicht daran gedacht den ganzen String als Unicode zu deklarieren... :shock: Danke für den Hinweis.
Leonidas hat geschrieben:Statt ``execvp`` würde ich eher zu ``subprocess`` raten.

Was spricht denn gegen execvp? Ich hatte execvp Hauptsächlich deswegen gewählt:
These functions all execute a new program, replacing the current process; they do not return. On Unix, the new executable is loaded into the current process, and will have the same process ID as the caller. Errors will be reported as OSError exceptions
Lieber Gruss
STiGMaTa
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus. (André Kostolany)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 2. Mai 2008, 23:34

STiGMaTa_ch hat geschrieben:Was spricht denn gegen execvp? Ich hatte execvp Hauptsächlich deswegen gewählt:
These functions all execute a new program, replacing the current process; they do not return. On Unix, the new executable is loaded into the current process, and will have the same process ID as the caller. Errors will be reported as OSError exceptions
subprocess ist wesentlich universeller, ich glaube nicht dass du die PID unbedingt beibehalten willst, oder? ``suprocess.Popen()`` && ``sys.exit()`` sollten ausreichend sein und sind wohl auf den ersten Blick einfacher von der Funktionsweise zu verstehen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
STiGMaTa_ch
User
Beiträge: 32
Registriert: Sonntag 14. Mai 2006, 22:58
Wohnort: Rueti ZH, Schweiz

Sonntag 4. Mai 2008, 22:11

Leonidas hat geschrieben:subprocess ist wesentlich universeller, ich glaube nicht dass du die PID unbedingt beibehalten willst, oder?
Müssen definitiv nicht. Ich dachte, dass die Verwendung von execvp sowas wie "guter Stil" wäre.
Leonidas hat geschrieben: ``suprocess.Popen()`` && ``sys.exit()`` sollten ausreichend sein und sind wohl auf den ersten Blick einfacher von der Funktionsweise zu verstehen.
Ich werde das mal ausprobieren. Danke für die Tipps!

Lieber Gruss
STiGMaTa
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus. (André Kostolany)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sonntag 4. Mai 2008, 23:07

Da sind imho viele unnötige if-Abfragen drin! Oftmals lassen die sich durch ein Dictionary umgehen!

Code: Alles auswählen

labels = {"Dokumentation":"docs\LureDocDE.pdf", "...":"...", ... }
if button_label in labels.keys():
    startfile(labels["button_label"], open)
sieht imho wesentlich handlicher aus ;-)

Diese "Technik" kannst Du auf viele Stellen anwenden, wie ich das gesehen habe.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 5. Mai 2008, 12:28

Ist ja auch niedlich :-) :

Code: Alles auswählen

# If the Play button has been pressed execute the Emulator.
        if button_label == "Spiel starten" or button_label == "Play the Game" \
                            or button_label == "Giocare" or \
                            button_label == "Jouer" or \
              button_label == "Jugar":
Du solltest nicht gegen die Beschriftung des Buttons testens, sondern gegen dessen Id. Dann kannst du die Beschriftung auch einfacher ändern und sparst eine Menge code. Vielleicht könntest du die Sprachen auch noch in Dictionaries auslagern, dann bist zu sehr flexibel:

Code: Alles auswählen

{"english": {
      "play":"Play the Game",
      ....
   },
  "german": {
       "play:":"Spiel starten",
       ...
   }
}
Oder gleich ein Ordner, in dem man beliebig viele Sprachendateien ablegen kann.
BlackJack

Montag 5. Mai 2008, 13:57

@Hyperion: Der Test sollte besser ``if button_label in labels:`` lauten. Wenn Du die `keys()`-Methode aufrufst, wird extra eine Liste mit den Schlüsseln erstellt, in der dann linear gesucht wird.
Benutzeravatar
STiGMaTa_ch
User
Beiträge: 32
Registriert: Sonntag 14. Mai 2006, 22:58
Wohnort: Rueti ZH, Schweiz

Dienstag 6. Mai 2008, 22:23

Hallo zusammen

Das mit den vielen if's war mir bewusst. Ich wusste nur nicht, wie ich es besser machen könnte (wie gesagt, das ist mein erstes Python Programm).

Aber dank eurer Tipps werde ich das am kommenden Weekend mal versuchen umzusetzen. Nochmals herzlichen Dank euch allen für die Zeit, welche Ihr euch genommen habt!

Lieber Gruss
STiGMaTa
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus. (André Kostolany)
lunar

Dienstag 6. Mai 2008, 22:37

Leonidas hat geschrieben:subprocess ist wesentlich universeller, ich glaube nicht dass du die PID unbedingt beibehalten willst, oder?
Allerdings auch minimal langsamer, da im Gegensatz zu exec* einen zusätzlichen fork erfordert. Nicht, dass das in irgendeiner Weise relevant wäre, aber mein EGO verlangt jetzt einfach danach, *es* besser zu wissen ;)

@OP
Wieso integrierst du eigentlich alle Sprachen in das Interface? Wäre es nicht klüger, ``gettext`` und ``locale`` dahingehend zu nutzen, je nach Spracheinstellung des Systems den passenden Button anzuzeigen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 7. Mai 2008, 07:09

BlackJack hat geschrieben:@Hyperion: Der Test sollte besser ``if button_label in labels:`` lauten. Wenn Du die `keys()`-Methode aufrufst, wird extra eine Liste mit den Schlüsseln erstellt, in der dann linear gesucht wird.
Oha ... da hast Du Recht! Wußte ich auch noch nicht, dass sich das sich der "in" Operator bei Dicts auf die Keys bezieht ... aber gut zu wissen :-)
Benutzeravatar
STiGMaTa_ch
User
Beiträge: 32
Registriert: Sonntag 14. Mai 2006, 22:58
Wohnort: Rueti ZH, Schweiz

Mittwoch 7. Mai 2008, 20:10

lunar hat geschrieben:@OP
Wieso integrierst du eigentlich alle Sprachen in das Interface? Wäre es nicht klüger, ``gettext`` und ``locale`` dahingehend zu nutzen, je nach Spracheinstellung des Systems den passenden Button anzuzeigen?
Prinzipiell sicher keine schlechte Idee. Aber beim LureChooser geht es gerade darum, dass man die Wahl hat welche Version man spielen will. Ein guter Bekannter von mir lernt z.B. gerade Spanisch. Sein OS ist komplett auf Deutsch, aber er spielt Lure of the Temptress am liebsten auf Spanisch. So lernt er "spielend" die Sprache ;-)

Mein Vetter stammt so richtig aus den Schweizer Bergen. Wenn es in seiner Nähe überhaupt einen Computerladen gab, dann war das irgend ein Fachhändler ohne PC's ab Stange. Aus diesem Grund hat er seinen Laptop im Mediamarkt in Zürich gekauft. In Zürich sind die Systeme für die Masse im Normalfall auf Deutsch. Programme etc. kauft er aber meistens in Italien (da er davon nur 30Km. entfernt wohnt). Also auch er ein Kandidat, welcher zwar ein Deutschsprachiges OS hat, aber sowas z.B. lieber auf Italienisch spielt.

Lieber Gruss
STiGMaTa
EDV-Systeme verarbeiten, womit sie gefüttert werden. Kommt Mist rein, kommt Mist raus. (André Kostolany)
Antworten