Code: Alles auswählen
In [32]: type(raw_input())
42
Out[32]: <type 'str'>
In [33]: type(raw_input)
Out[33]: <type 'builtin_function_or_method'>
Code: Alles auswählen
In [32]: type(raw_input())
42
Out[32]: <type 'str'>
In [33]: type(raw_input)
Out[33]: <type 'builtin_function_or_method'>
Ja, eigentlich ganz logisch, es hat geklingelt.BlackJack hat geschrieben:``raw_input()`` ist ein Funktions*aufruf* der eine Zeichenkette zurückgibt. ``raw_input`` ist eine Funktion:
Warum hast es mir denn nicht gleich so erklärt, dann müsste ich mir nicht so begriffsstutzig vorkommen, looolWie man an dem Beispiel sieht, ist es nicht ganz egal was man übergibt, weil dadurch der Zeitpunkt bestimmt wird, wann die Eingabefunktion ausgeführt wird, ob nun vor dem Aufruf von `test()` oder erst in `test()`.Code: Alles auswählen
In [32]: type(raw_input()) 42 Out[32]: <type 'str'> In [33]: type(raw_input) Out[33]: <type 'builtin_function_or_method'>
Dieser Teil ist jetzt in Bezug auf mein Beispiel noch nicht ganz klar. Im vorigen Beispiel dann doch besser:Wenn die Funktion vor dem Aufruf nicht irgendetwas macht oder die Eingabefunktion mehrfach aufruft, ist die Funktionsübergabe statt einer Zeichenkette unnötig komplex.
Code: Alles auswählen
eingabe = wert_funktionsaufruf
#... und daher dann z. Bsp bei Entry
....command = lambda:entry.get()....
Code: Alles auswählen
def edit(self, number):
data = self.entries[int(number) - 1]
for key in self.keys:
if data[key]:
entry = raw_input("%s %s neu ? --> " % (key.capitalize(),
data[key]))
else:
entry = raw_input("%s hinzufügen ? --> " % key.capitalize())
if entry:
data[key] = entry
Code: Alles auswählen
"%s %s neu ? --> " % (key.capitalize(),
data[key])
Code: Alles auswählen
>>> brain = (1, ('Brain', 'Weltherrscher'))
>>> records = [erik, brain]
>>> records
[(0, ('Erik', 'Wikinger')), (1, ('Brain', 'Weltherrscher'))]
Hallo pyStyler,pyStyler hat geschrieben:Hallo rolgal,
hier mal ein versuch mit einer Gui.
Die Gui ist mit SpecTcl erstellt also lass dich nicht von 300 Zeilen Guicode stören.
http://www.ubuntuusers.de/paste/11311/
MultiListBox: http://www.ubuntuusers.de/paste/11313/
Es ist echt nur ein versuch und es muss weiter ausgebaut werden.
Gruss
pyStyler
Ahhhh,....und ich glaube durch einen zweiten Blick auf den Code zu wissen warum, also stimme ich eigentlich weiter zu:-)Was der Code auf jeden Fall mehr "kann", ist die Trennung von Programmlogik und GUI.
Code: Alles auswählen
def main():
path = "C:/Dokumente und Einstellungen/rolgal/Eigene Dateien/Unterricht/PI Tirol/Python/adressbuch.bin"
try:
addresses = Addresses.load(path)
except IOError:
addresses = Addresses(['name', 'vorname', 'straße', 'nummer', 'plz',
'ort'])
print addresses
addresses.enter()
keyword = raw_input('Suchbegriff: ')
print addresses.search(keyword)
addresses.save(path)
if __name__ == "__main__":
main()
Code: Alles auswählen
>>>
[{'nummer': '', 'name': 'Huber', 'ort': '', 'stra\xdfe': 'Daxgasse', 'plz': '', 'vorname': 'Gerhard'}]
Traceback (most recent call last):
File "C:/Dokumente und Einstellungen/rolgal/Eigene Dateien/Programmierung/Forum/oop_databook_bj.py", line 80, in <module>
main()
File "C:/Dokumente und Einstellungen/rolgal/Eigene Dateien/Programmierung/Forum/oop_databook_bj.py", line 73, in main
addresses.enter()
AttributeError: 'list' object has no attribute 'enter'
>>>
Hätte mich doch gewundert, wenn der Fehler nicht bei mir gelegen wäreBlackJack hat geschrieben:Die Datei scheint eine Liste und kein `Addresses`-Objekt zu enthalten. Mit der `Adresses.save()`-Methode ist die Datei also wohl nicht erstellt worden.
Code: Alles auswählen
def enter(self):
number = 0
values = []
for key in self.keys:
entry = raw_input("%s: " % key.capitalize())
if entry:
values.append(entry)
number += 1
else:
values.append("")
if number >= self.instance.min_entries:
self.instance.add_entry(values)
print "Entry added"
else:
print "You have to make at least %s entries" % self.instance.min_entries
Mach dich ruhig lustig,.....BlackJack hat geschrieben:Das man so etwas mit einer Ausnahme, zum Beispiel `ValueError` im `DataBook` beantwortet, ist wahrscheinlich für Deine Zielgruppe angeblich wieder zu kompliziert.
Code: Alles auswählen
def add_entry(self, values):
if sum(1 for value in values if value) >= self.min_entries:
data = {}
for i, key in enumerate(self.keys):
data[key] = values[i]
self.entries.append(data)
else:
raise ValueError("Minimum Entries %s" % self.min_entries)
Sowas habe ich mir eigentlich gedacht, heisst im Idealfall vorgestellt, aber ich habe schon ein except, das mit return eine Meldung zurückgibt, die eigentlich aber nicht zu sehen ist. Irgendwas habe ich im Detail noch nicht geschnallt.BlackJack hat geschrieben:`ValueError` weil das IMHO von den Standard-Ausnahmen am besten passt -- der Wert des Arguments entspricht nicht den Vorgaben.
Damit sich das Programm nicht beendet, sollte man die Ausnahme natürlich an der entsprechenden Stelle im Programm mit ``try``/``except`` behandeln. Und den Benutzer darüber informieren und ihm am besten den Eintrag nochmal zum bearbeiten vor die Nase setzen.