Deine Fenster habe ich mich jetzt nicht angeguckt, aber das API von Deiner Vokabelklasse ist ja (immer noch) grauenhaft:
Code: Alles auswählen
def add_vocable(self):
self.vocables.append({"vocable1" : "",
"vocable2" : "",
"crib" : ""})
def change_vocable(self, index, vocable1, vocable2, crib):
self.vocables[index] = {"vocable1" : vocable1,
"vocable2" : vocable2,
"crib" : crib}
# und dann zum Benutzen:
vocabulary.add_vocable()
vocabulary.change_vocable(0, "Hund", "dog", "Dogge")
vocabulary.add_vocable()
vocabulary.change_vocable(1, "Katze", "cat", "Kitekat")
vocabulary.add_vocable()
vocabulary.change_vocable(2, "Ratte", "rat", "ohne te(e)")
Das musst Du doch selber sehen, wie umständlich Du das gelöst hast!
Wieso kann `add_vocable` nicht die Argumente direkt aufnehmen? Und Dein `change_vocable` könnte doch dann einfach `delete_vocable` und `add_vocable` nutzen!
Zudem verstehe ich immer noch nicht, wieso Du das als Liste von Dictionaries ablegst. Wesentlich einfacher wäre es imho immer noch, das ganze als Dictionary anzulegen. Wenn Du darin Übersetzung(en) und Hinweiswort flexibel organisieren willst, dann nutze eben als Wert ein weiteres Dictionaries mit fixen Keys:
Code: Alles auswählen
vocabularies = {
"eat" : {
"translations": ["essen", "fressen"],
"mnemonic": "Nicht trinken, sondern..."
},
"walk": { ... },
...
}
Wenn man wirklich mit solchen Zusatzinformationen arbeiten will, dann würde ich mir fast überlegen, eine einzelne Vokabel noch in einer Klasse zu modellieren.
Auf jeden Fall ist deine jetzige Form ziemlich umständlich.
Ein Index als Zugriff auf eine Vokabel ist an sich auch schon keine gute Idee, da sich bei Änderungen der Reihenfolge ggf. Abhängigkeiten verschieben! Bedenke doch mal, Du willst später mal "Lektionen" einführen, also Sammlungen von Vokabeln. Bei Deinem Ansatz wäre das so etwas wie eine Liste von Indizes:
Nun musst Du beim Löschen einer Vokabel aufpassen, dass Du die Referenz auch aus der Lektion heraus nimmst, da sich ansonsten alle anderen Referenzen ja verschöben. Nehmen wir an, dass die Vokabel mit dem Index 6 gelöscht würde, dann würden nun die restlichen Vokabeln 10, 22 und 34 auf eine andere Vokabl verweisen, nämlich die bis dato jeweils danach kommende.
Würdest Du das Wort als Schlüssel nutzen, dann könntest Du bei der Lektion diesen einfach nutzen. Damit musst Du zwar aufpassen, ob das Wort noch existiert (`KeyError` kann man leicht abfangen und dazu nutzen!), aber alle *anderen* Wörter bleiben Dir genau so erhalten.
Weiterhin fiel mir noch dieses Konstrukt auf:
Code: Alles auswählen
deleted = True
for file_index in selection:
try:
os.remove(os.path.join("vocabulary",
mainwindow.files[file_index]))
except WindowsError:
deleted = False
if deleted:
msg.showinfo(title = "Erfolgreich gelöscht",
message = "Die ausgewählten Listen wurden erfolgreich gelöscht")
else:
msg.showinfo(title = "Fehler",
message = "Beim Löschen ist ein Fehler aufgetreten")
Das ist doch auch wieder so eine unnötige Sache! Wozu brauchst Du `deleted`? Doch nur, um *außerhalb* des `try...except`-Konstruktes nachträglich zu gucken, ob eine Ausnahme passiert ist oder nicht. Stattdessen kannst Du Dir das doch komplett sparen und die Aktionen eben *in* den Block reinziehen:
Code: Alles auswählen
for file_index in selection:
try:
os.remove(os.path.join("vocabulary",
mainwindow.files[file_index]))
msg.showinfo(title = "Erfolgreich gelöscht",
message = "Die ausgewählten Listen wurden erfolgreich gelöscht")
except WindowsError:
msg.showinfo(title = "Fehler",
message = "Beim Löschen ist ein Fehler aufgetreten")
Generell würde ich mir noch mal mehr Gedanken zu meiner Datenstruktur machen, bevor ich an der GUI weiterarbeiten würde. Und solltest Du nun noch daran etwas ändern, hast Du bestimmt einige Mühe beim Refactorn Deines GUI-Codes... und genau deswegen lohnt es sich, das im Vorfeld möglichst gut zu durchdenken
