Brauche Hilfe bei einem Vokabeltrainer

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Knight2000
User
Beiträge: 7
Registriert: Mittwoch 14. Februar 2007, 17:05

Dieser Vokabeltrainer ist mein erster "Gehversuch" in Python. Ich glaube das ist zwar vielleicht ein wenig zu schwer, aber ich will es schaffen das der Vokabeltrainer richtig funktioniert.
Ich hab mir das ganze so gedacht:

1.Es sollen verschiedene Themen zur Abfrage wählbar sein, nicht dass alles auf einmal abgefragt wird.

2. Die einzelnen Themen sollen, je nach Wunsch des Benutzers in Englisch - Deutsch; Deutsch - Englisch; oder Englisch - Englisch abgefragt werden.

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
try:				#clearscreen
    s = sys.winver
    os.system("cls")
except:
    os.system("clear")

 
width=80

def abfrage ():
	#Vokabelabfragen
	for key, value in Vokabeln.iteritems():
    	 Eingabe = raw_input(key)
    	 if Eingabe == value:
        	print 'Richtig'
    	 else:
        	print 'Falsch, richtig gewesen wäre: ', value


h0="*~~Vokabeltrainer~~*"		#Überschrift
h0=h0.center(width)

print h0

print '''

1= Holes
2= Enter 2000: The USA Today
3= The Visit
4= Toni Morrison on Racism
5= False Friends 
'''		

m=raw_input("Welche Vokabeln möchtest du abgefragt werden?") #Frage


#Importvorgänge
if m=="1":
	from holes import Vokabeln
	abfrage()

elif m=="2":
	n=raw_input("Deutsch - Englisch (a) oder Englisch - Deutsch (b) oder Englisch - Englisch(c)?")
	if n=="b": 	
		from the_usa_today import Vokabeln
		abfrage()
	if n=="a":
		from the_usa_today1 import Vokabeln
		abfrage()
	if n=="c":
		from the_usa_today2 import Vokabeln
		abfrage()

elif m=="3":	
	n=raw_input("Deutsch - Englisch (a) oder Englisch - Deutsch (b) oder Englisch - Englisch(c)?")
	if n=="b":
		from the_visit import Vokabeln
		abfrage()
	if n=="a":
		from the_visit1 import Vokabeln
		abfrage()
	if n=="c":
		from the_visit2 import Vokabeln
		abfrage()
	

elif m=="4":
	n=raw_input("Deutsch - Englisch (a) oder Englisch - Deutsch (b) oder Englisch - Englisch(c)?")
	if n=="b":
		from toni_morrison import Vokabeln
		abfrage()
	if n=="a":
		from toni_morrison1 import Vokabeln
		abfrage()
	if n=="c":
		from toni_morrison2 import Vokabeln
		abfrage()

elif m=="5":
	from false_friends import Vokabeln
	abfrage()
Das ist der bisherige Quelltext. Es klappt eigentlich auch ganz gut, nur finde ich das es ein wenig umständlich ist.
Wie man hoffentlich erkennen kann, ist der Vokabeltrainer aus mehreren Dateien zusammengebaut, die die einzelnen Vokabeln enthalten. Diese sind nach diesem Muster gestrickt:

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf8 -*-

Vokabeln = {
'Amtsführung ' : 'administration',
'hinter etwas stehen ' : 'to be committed to',
'zurückgewiesen ' : 'to be denied something',
'Vertrag ' : 'contract',
'Schicksal ' : 'destiny',
'währenddessen ' : 'in the meantime',
'jmd. einschüchtern ' : 'to intimidate someone',
'überwältigend ' : 'overwhelmingly',
'jemandem auf die Schulter klopfen ' : 'to pat someone on the back',
'Pick-Up ' : 'pickup',
'angesehen ' : 'prestigious',
'empfehlen ' : 'to recommend',
'akademisch ' : 'scholastically',
'verhungern ' : 'to starve',
'Anstellung auf Lebenszeit ' : 'tenure',
'Aushängeschild ' : 'token',
}
Hier liegt die erste Sache die mich stört. Nach meinem Muster muss ich für jede Abfragerichtung eine neue Datei anlegen. Das bedeutet viel Aufwand. Ich glaube das muss nicht unbedingt sein. Ich hab in einem anderen Thread irgendwas von YAML gelesen, jedoch weiß ich nicht wie das funktioniert.

Wie gesagt, dass was erstmal funktionieren sollte ist:
1.Es sollen verschiedene Themen zur Abfrage wählbar sein, nicht dass alles auf einmal abgefragt wird.

2. Die einzelnen Themen sollen, je nach Wunsch des Benutzers in Englisch - Deutsch; Deutsch - Englisch; oder Englisch - Englisch abgefragt werden.

Fehler zählen und falsche Vokabeln in eine seperate Datei speichern, die bei Wunsch abgefragt werden kann, ist am Anfang nicht so wichtig!

Ich erwarte hier keine kompletten Lösungen. Ansätze reichen mir auch.

€dit: Sorry für den unleserlichen Beitrag.... wenn noch was unklar ist fragt...
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Hi Knight2000!

So wie du die Vokabeln speicherst, ist es in der Tat etwas umständlich.
Die einfachste Möglichkeit wäre, die Vokabel der einzelenen Themen/Lektionen in Textdateien zu speichern, dann kann man sie auch leicht ändern. Du brauchst nur ein Trennungszeichen für jede Zeile und ein paar Regeln, dass du das ganze einlesen kannst. Sonst kannst du auch die Vokabeln mit pickle speichern, wobei das auch nur was bringt, wenn man über das Programm die Vokabeln eingibt.
Außerdem reicht dann eine Liste pro Lektion, da du "engl-wort <> dt.wort <> engl.erklärung" wenn du es richtig einliest drehen kannst, wie du willst.
Dann kannst du die txt-Dateien oder Dict-Schlüssel nach den Lektionen benennen, sodass du statt ewig langer elif-Konstrukte einfach schreiben kannst "%s.txt"%(Lektion) bzw. vokabeln[Lektion].
Da dein Programm dann sehr kurz wird, ist es vlt. nicht umbedingt nötig, mit einer Klasse zu arbeiten, aber je nach dem, wie weit du es erweitern willst, solltest du dir _vor_ dem Programmieren überlegen, wie du das Programm bzw. den Code aufbaust bzw. strukturierst.
Ach, und die falschen in eine Liste schreiben, dessen Länge auslesen, und dann als Datei speichern sollte auch nicht so schwer sein.

Gruß, jj
Benutzeravatar
Knight2000
User
Beiträge: 7
Registriert: Mittwoch 14. Februar 2007, 17:05

Danke, schaus mir am Wochenende mal an.
Benutzeravatar
Knight2000
User
Beiträge: 7
Registriert: Mittwoch 14. Februar 2007, 17:05

Ich hab mir das ganze jetzt mal so überlegt. Ich mache es nicht mit .txt Dateien.
so sieht jetzt das Hauptprogramm, bzw. erst mal nur die Abfragen aus:

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-
import random

def eng2expl():
 random.shuffle(Lektion)
 for english, expl , german in Lektion:
     eingabe = raw_input('Bitte die Erklärung von %s eingeben: ' % english)
     if eingabe.lower() == expl.lower():
         print 'Die Antwort war richtig! '
     else: print 'Die Antwort war leider falsch ',expl, ' wäre richtig gewesen.'

def ger2eng():
 random.shuffle(Lektion)
 for english, expl, german in Lektion:
     eingabe = raw_input('Bitte die englishe Übersetzung von %s eingeben: ' % german)
     if eingabe.lower() == english.lower():
	print 'Die Antwort war richtig! '
     else: print 'Die Antwort war leider falsch "', english, '" wäre richtig gewesen.'		


def eng2ger():
 random.shuffle(Lektion)
 for english, expl, german in Lektion:
     eingabe = raw_input('Bitte die deutsche Übersetztung von %s eingeben: ' % english)
     if eingabe.lower() == german.lower():
	print 'Die Antwort war richtig! '
     else: print 'Die Antwort war leider falsch"', german, '"wäre richtig gewesen.'
Die einzelnen Vokabeldateien sehen nun so aus:

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-

vokabeln = [('to accomplish something', 'to reach something', 'etwas erreichen'),
                   ('actual', 'opposite of a dream', 'wirklich'),
                   ('amazement', 'astonishment', 'Erstaunen'),
                   ('angular', 'having sharp and definite corners', 'eckig')] 
Wenn ich im Hauptprogramm bei random.shuffle() das Lektion nicht in die Klammer setze bekomm cih nen Fehler:
mcflow@errorkiste:~/Tools/Python/Vokabeltrainer/test$ python voktrain.py
Traceback (most recent call last):
File "voktrain.py", line 31, in ?
eng2ger()
File "voktrain.py", line 24, in eng2ger
random.shuffle()
TypeError: shuffle() takes at least 2 arguments (1 given)
Wie könnte ich es denn nun anstellen das "Lektion" den Wert "vokabeln" im oberen Beispiel erhält. Es soll aber auch möglich sein, dass es zum Beispiel "blubb" sein könnte, wenn es in einer anderen Vokabeldatei so steht.
"Lektion" soll halt je nach den importierten Vokabeln anders sein.
Zuletzt geändert von Knight2000 am Samstag 19. Mai 2007, 10:07, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Code: Alles auswählen

import Lektion
random.shuffle(Lektion.vokabeln)
oder meinst du...

Code: Alles auswählen

import Lektion as vocabulary_source
Lektion = vocabulary_source.vokablen
random.shuffle(Lektion)
aber das finder ich irgendwie seltsam
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Knight2000
User
Beiträge: 7
Registriert: Mittwoch 14. Februar 2007, 17:05

Leonidas hat geschrieben:

Code: Alles auswählen

import Lektion as vocabulary_source
Lektion = vocabulary_source.vokablen
random.shuffle(Lektion)
aber das finder ich irgendwie seltsam
Das ist auch irgendwie seltsam, hat mir aber trozdem auf die Sprünge geholfen:

Code: Alles auswählen

from VOKABELDATEI import vokabeln as Lektion
So steht es jetzt erst mal und es klappt wohl auch.
Antworten