Ein Adressbuch mit Tkinter

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ein letzer Versucht macht ja beinahe genau so wenig Sinn :D Warum sollte man mehrere Adressen in einem Objekt "Adressen" zusammenfassen, dass ist doch eigentlich schon das Adressbuch! Ziel ist es ja nicht, das Programm in irgend welche Objekte zu zerlegen, sondern in sinnvolle Objekte, welche man so unter Umständen auch in der Realität verwenden würde.

Hier mal ein sinnvoller Aufbau kurz angerissen:

Code: Alles auswählen

import pickle

class Adresse(object):
    def __init__(self, name, vorname, strasse, ort, ...):
        self.name = name
        self.vorname = vorname
        self.strasse = strasse
        self.ort = ....

class Adressbuch(object):
    def __init__(self, adress_datei):
        self.adressen = self.load(adress_datei)

    def laden(self, adress_datei):
        try:
            fp = open(adress_datei, "rb")
        except IOError:
            return []
        else:
            return pickle.load(fp)
            fp.close()

    def speichern(self, adress_datei):
        fp = open(adress_datei, "wb")
        pickle.dump(self.adressen, fp)
        fp.close()

    def neue_adresse(self, name, vorname, ...):
        self.adressen.append(Adresse(name, vorname, ...))
Der init-Methode von "Adresse" könnte man natürlich auch einfach beliebige Keywords übergeben, so könnte man beliebig viele Eigenschaften zu einer Adresse speichern.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke EyDu !

Ok - Ich gebe meiner Klasse den Namen Adressbuch und dann ist sie doch genauso gut wie deine - oder ?

gruss frank
BlackJack

Ignorier den Beitrag von EyDu einfach.

Zu Deinem letzten Versuch: Methoden sollten in der Regel entweder den Zustand des Objekts verändern oder Informationen über den aktuellen Zustand liefern. `laden()` macht das nicht. Wurde aber schon mehrfach erwähnt.

Der Teil in der Ausnahmebehandlung ist sehr komisch und umständlich. Da wird eine Zeichenkette mit Leerzeichen erstellt, die dann zu einer identischen Zeichenkette mit Leerzeichen zeichenweise zusammengesetzt nur um dann in eine Liste mit Leerzeichen wieder auseinandergenommen zu werden. Argh!

Wobei ich sowieso nicht so ganz verstehe warum das Adressbuch einen leeren Datensatz enthalten soll wenn es nicht geladen werden kann.

Die Ausnahmebehandlung ist an der Stelle auch nicht ganz glücklich. Wenn diese Klasse in einem Programm verwendet wird, und der Benutzer einen Dateinamen angeben kann, dann sollte er darüber informiert werden, dass es keine Datei mit diesem Namen gibt und nicht einfach ein leeres Adressbuch bekommen.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke BlackJack !

Ok - laden muss ich die Adressen doch ! Von Aussen darf ich es nicht in der Klasse auch nicht ?

Das mit der Übergabe einer leeren Liste kommt daher, dass ich bei der Version mit Tkinter eine Fehlermeldung hatte und diese damit aufgehoben hatte. Konnte nichts anzeigen bei einem leeren Adressbuch.

Warum ist das eigentlich mein letzter Versuch ? Hört sich wie eine Drohung an - war ja eigentlich mein nächster Versuch !

gruss frank
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

EyDu hat geschrieben:Hier mal ein sinnvoller Aufbau kurz angerissen
Gratuliere, sieht ähnlich aus, wie mein Versuch kaytec einen sinnvollen Klassenaufbau zu zeigen. ;)

kaytec, die laden() Funktion soll *nichts* (also nur None) zurückgeben, keine Liste von Adressen sondern den *Zustand* der Klasse ändern. Außerdem, wenn man an irgendeiner Stelle in einer Klasse vordefinierte Variablen brauch, seinen sie None oder leere Listen, dann initialisiert man sie in __init__().
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke Leonidas !

Ist die Klasse jetzt komplett falsch oder nur das Laden ?

Mein nicht letzter Versuch !

http://www.ubuntuusers.de/paste/13704/

gruss frank
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

kaytec hat geschrieben:Mein nicht letzter Versuch !

http://www.ubuntuusers.de/paste/13704/
Sieht schon besser aus, allerdings denke ich, dass die ``laden`` Funktion die Ausnahmen anders behandlen sollte (hat BlackJack glaube ich schon geschrieben): im Moment ist es einfach so, dass wenn die Datei nicht gefunden wurde, dass dann einfach alle etwaig vorhandenen Adressen in der Klasse gelöscht werden. Schlauer wäre es, in der Ausnahmebehandlung eine andere Ausnahme zu werfen, die dem User sagt: "Hier ist was schief gelaufen, und zwar ...".
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke Leonidas !

Das Laden sollte 'nichts' (also nur 'None') zurückgeben - hast du geschrieben! Dies habe ich doch gemacht - oder ?. Falls jetzt 'none' zurückgegeben wird, kann doch der Benutzer noch gar keine Daten in das Adressbuch eingegeben haben. Er könnte doch eine neue Datei über das Speichern anlegen !?

gruss frank
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

kaytec hat geschrieben:Das Laden sollte 'nichts' (also nur 'None') zurückgeben - hast du geschrieben! Dies habe ich doch gemacht - oder ?.
Ja, das schon.
kaytec hat geschrieben:Falls jetzt 'none' zurückgegeben wird, kann doch der Benutzer noch gar keine Daten in das Adressbuch eingegeben haben.
Nein, jetzt wird so oder so None ausgegeben - egal ob es eine Datei zum Laden gab oder nicht. Dummerweise bekommt der Nuter der Klasse nicht die Möglichkeit zu unterscheiden, ob die Datei erfolgreich eingelesen wurde oder ob so eine Datei gar nicht existiert. Also solltest du eine Ausnahmen werfen, die besagt, dass die Datei nicht vorhanden ist. Auf diese kann der Nutzer der Klasse dann entsprechend reagieren.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke Leonidas !

Falls er das Laden versucht sollte nicht None zurückgegeben werden. Wie könnte solch eine Rückgabe aussehen ? Zurückgeben könnte man ja irgendwie jeden Blödsinn und ich kann dies besonders gut !

gruss frank
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

kaytec hat geschrieben:Falls er das Laden versucht sollte nicht None zurückgegeben werden. Wie könnte solch eine Rückgabe aussehen ? Zurückgeben könnte man ja irgendwie jeden Blödsinn und ich kann dies besonders gut !
Doch, sicher sollte bei einem erfolgreichen Laden ``None`` zurückgegeben werden und eben kein Statuswert. Wenn Fehler in Programmen auftauchen, dann werden in Python Ausnahmen geworfen statt wie in C Rückgabewerte zu prüfen. Dies hat den Vorteil, dass man nicht vergessen kann, irgendwo den Statuswert zu prüfen und das Programm ohne weiteres weiterläuft.

Sieht dann etwa so aus:

Code: Alles auswählen

class AdressbuchNichtGefundenException(IOError): pass

def laden(dateiname):
    try:
        f = file(dateiname, 'r')
        # irgendwas mit f machen
     except (IOError, e):
         raise AdressbuchNichtGefundenException("Die Datei, die das Adressbuch enthält, konnte nicht geladen werden")
Das heißt, dass immer wenn ein IOError auftritt, wird eine andere Exception geworfen, die das auftretende Problem besser beschriebt. Oder man lässt die Try-Except Geschichte ganz weg und lässt den Nutzer der Klasse selbst mit dem IOError irgendwie fertig werden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke Leonidas !

Ich habe mit der Klasse ein wenig rumprobiert. Falls eine Adressdatei vorhanden ist, kann ich über diese itterieren etc. Wenn keine vorhanden ist, bekomme ich die gewünschte Fehlermeldung ('Datei nicht vorhanden....'). Möchte ich nun ein neue Datei anlegen, ist self.adressen ja noch None. Self.adressen müsste aber list() sein, damit ich irgendwelche Aktionen durchführen kann. Setze ich in der ' __init__' Zeile self.adressen = list(), dann gehen alle gewünschten Aktionen. Nach deiner Aussage sollte es aber doch None sein ...?

gruss und dank frank
BlackJack

Die Aussage kann ich nirgends finden. In der `__init__()` sollte das Objekt in einen konsistenten, benutzbaren Zustand gebracht werden. Eine leere Liste macht da mehr Sinn als `None`.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Die Aussage kann ich nirgends finden.
Ich kann mich ebenso nicht erinnern. Ich habe zwar gesagt, dass Werte oft mit None initialisiert werden, aber in ``__init__()`` sollte man ``self.adressen`` als Liste initialisieren - das siehst du ganz richtig und das hätte ich auch getan.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Danke BlackJack und Leonidas !

Ein Versuch mit Tkinter !

http://www.ubuntuusers.de/paste/13746/

Diese Version ist noch nicht mit einer geeigneten Lösung für eine nicht vorhandene Adressdatei.

gruss frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

An der Suche gebastelt !

http://www.ubuntuusers.de/paste/13750/

gruss frank
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo !

Habe an den Fehlermeldungen rumgebastelt und sie in die Oberfäche eingebaut. Ist es so ok ?

edit : Link war falsch

gruss frank

edit: Es fehlt der import von Toplevel
Zuletzt geändert von kaytec am Donnerstag 16. August 2007, 09:04, insgesamt 1-mal geändert.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Der letzte Link ist leider etwas falsch, oder es ging hier wirklich um eine Xorg.conf?
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Das ist der richtige Link !

http://www.ubuntuusers.de/paste/13818/

Wie ist das passiert ?

gruss frank
Antworten