Seite 1 von 3
Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 13:36
von nono191
Ich möchte ein Kochbuch machen in das man selber Rezepte schreiben kann machen, wenn ich es ausführe und beende sind aber alle gelöscht, wie könnte ich das machen?
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 13:42
von BlackJack
@nono191: Die Frage ist irgendwie nicht eindeutig: Willst Du jetzt wissen wie man das machen kann das am Ende alle Daten gelöscht sind, oder ist genau das Dein Problem?
Wie speicherst Du die Daten denn?
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 13:45
von nono191
@BlackJack: Genau das ist mein problem.
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 13:58
von BlackJack
@nono191: Was denn jetzt *genau*? Was für Daten hast Du? Typen, Struktur, …? Würde JSON als Format ausreichen?
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 13:59
von nono191
@BlackJack: Ich speichere sie gar nicht.
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 14:01
von nono191
Code: Alles auswählen
import easygui
antwort = easygui.buttonbox("Ich schenke dir ein Kochbuch. Willst du es jetzt nutzen?",
choices = ["Ja", "Nein"] )
if antwort == "Nein":
antwort2 = easygui.buttonbox("Schade, ein andermal?",
choices = ["Ja", "Nein", "Vieleicht"] )
if antwort2 == "Ja":
easygui.enterbox("Wann?")
easygui.msgbox("Okay, ich freu mich")
if antwort2 == "Nein":
easygui.msgbox("Schade")
if antwort2 == "Vieleicht":
easygui.msgbox("Okay, vieleicht bis später")
else:
aktuelleantwort1 = easygui.buttonbox("In welcher Kategorie willst du nachschauen oder etwas einspeichern?",
choices = ["Snacks", "Vorspeise", "Hauptgang", "Dessert"] )
abrufen_einspeichern = easygui.buttonbox(title = aktuelleantwort1, msg = "Willst du etwas einspeichern oder etwas abrufen?",
choices = ["Einspeichern", "Abrufen"] )
if abrufen_einspeichern == "Einspeichern":
if aktuelleantwort1 == "Snacks":
hinzufuegen = easygui.enterbox ("Gib den Namen des Rezeptes ein, das du bei Snacks hinzufügen willst.")
Snacks = list(hinzufuegen)
for i in hinzufuegen:
del Snacks[0]
Snacks.append(hinzufuegen)
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 14:43
von BlackJack
@nono191: Na dann: Nimm JSON. Da gibt's ein Modul in der Standardbibliothek. Denk Dir eine sinnvolle Datenstruktur aus. Ein Wörterbuch das die Kategorien auf Listen mit den Rezepten abbildet wäre passend. Dann braucht man auch keine Vergleiche mit ``if`` auf die Kategorie.
Die Zeilen ab 23 machen nicht wirklich Sinn.
Die Namen sind teilweise nicht gut. Wenn man anfängt Namen durchzunummerieren macht man etwas falsch. Entweder man war zu faul sich einen richtigen Namen auszudenken, oder man hat zu viele Namen, oder man möchte eigentlich eine Datenstruktur verwenden. Meistens eine Liste.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Funktionen ist dann auch das Stichwort: Schreibe welche. Und trenne dabei die Programmlogik von der Benutzerinteraktion.
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 15:07
von nono191
@BlackJack: Merci, verwende diese Programmiersprache noch nicht lange

:K .
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 15:15
von nono191
@BlackJack: Wie geht das mit JSON genau?
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 16:05
von BlackJack
@nono191: Man übergibt der entsprechenden Funktion eine Datenstruktur die sich als JSON serialisieren lässt, also zum Beispiel ein Wörterbuch das Kategorien auf Listen mit Rezepten (die auch wieder aus JSON-serialisierbaren Werten bestehen müssen), und ein zum schreiben geöffnetes Dateiobjekt. Hast Du Dir die Dokumentation mal durchgelesen?
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 16:25
von nono191
@BlackJack: Welche Dokumentation?
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 16:31
von /me
nono191 hat geschrieben:@BlackJack: Welche Dokumentation?
Die offizielle
Dokumentation zu json.
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 17:43
von mutetella
@nono191: Ich hab' mal was gebastelt, das unter anderem
json und
defaultdict nutzt. Vielleicht hilft's Dir ein wenig beim Verständnis...
Code: Alles auswählen
from collections import defaultdict as DefaultDict
import json
def load():
try:
with open('recipes.txt') as file_:
recipes = DefaultDict(list, json.load(file_))
except IOError:
recipes = DefaultDict(list)
return recipes
def save(recipes):
with open('recipes.txt', 'w') as file_:
json.dump(recipes, file_)
def get_category(prompt, recipes):
categories = recipes.keys()
for number, name in enumerate(categories):
print '{:2d}: {}'.format(number, name)
category = raw_input(prompt)
try:
category = categories[int(category)]
except (ValueError, IndexError):
pass
return category
def add(recipes):
try:
recipe = raw_input('Ihr Rezepttext (Ctrl-C beendet): ')
except KeyboardInterrupt:
return
category = get_category(
'Unter welche Kategorie faellt Rezept? ', recipes
)
recipes[category].append(recipe)
def show(recipes):
if recipes:
category = get_category(
'Aus welcher Kategorie sollen Rezepte gezeigt werden? ', recipes
)
for recipe in recipes[category]:
print '\n{}\n***\n'.format(recipe)
else:
print 'Keine Rezepte vorhanden!\n'
def run():
menu = [
('Neues Rezept', add),
('Zeige Rezepte', show)
]
recipes = load()
while True:
print
for item_number, item in enumerate(menu):
print '{:2d}: {}'.format(item_number, item[0])
try:
choice = int(raw_input('Ihre Wahl (Ctrl-C beendet): '))
except (ValueError, IndexError):
print 'Bitte gueltige Nummer eingeben...',
except KeyboardInterrupt:
break
print
menu[choice][1](recipes)
save(recipes)
mutetella
P.S. Mein Code ist Python 2 konform, falls Du Python 3 nutzt, musst Du ``raw_input()`` durch ``input()`` ersetzen und ``print`` als Funktion verwenden...
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 18:24
von nono191
@all: Ich muss mich erstmal bedanken: Auf dieser Seite wird man mega nett behandelt und so... Aber ich bin erst 11 (und finde es ist bisschen kompliziert geschrieben) und nutze Phyton erst seit 2 Monaten... Könntet ihr mir bitte anweisungen zum Kochbuch geben

:K . Das wär mega nett.
Re: Kochbuch
Verfasst: Dienstag 6. Oktober 2015, 21:04
von mutetella
@nono191
Grundsätzlich solltest Du einfach bei allem, das Du nicht verstehst, erstmal in der
Dokumentation bzw. dem
Tutorial nachschlagen. Auch wenn es auf den ersten Blick nicht so scheint, die fundiertesten Infos findest Du dort!
Zu meinem Beispiel: Zuerst einmal habe ich versucht, währenddem ich programmiere darauf zu achten, das zu trennen, was irgendwie nicht zusammengehört. Zum Beispiel waren die beiden Funktionen `get_category` und `add` ursprünglich zusammengefasst, bis ich dann bemerkte, dass der Teil, der jetzt in `get_category` steht, auch an anderer Stelle gebraucht wird (nämlich in `add`
und `show`). Also habe ich den Code entsprechend getrennt, um Doppeltes zu vermeiden. Somit hatte ich irgendwann verschiedenste Funktionen, die jeweils für sich genommen soweit als möglich immer nur eine Sache erledigen. Ok, das könnte man sicher noch weiter verfeinern, aber zum jetzigen Zeitpunkt ist das sicher mal ok so. Ich hab' also jetzt eine "Hauptfunktion", die ich `run` genannt habe, könnte man auch `main` nennen. Von dort aus springe ich in die einzelnen "Unterfunktionen", je nachdem, was der Anwender auswählt.
Ich würde Dir also empfehlen, die Funktion `run` einfach mal Zeile für Zeile durchzugehen und anhand der
Dokumentation und weiterführenden Infos zu verstehen, was da im Einzelnen geschieht. Also, was bedeutet ``def run():``, welchen Sinn hat
Code: Alles auswählen
menu = [
('Neues Rezept', add),
('Zeige Rezepte', show)
]
was man doch auch in eine Zeile schreiben könnte, aber warum dann in 4? und so weiter...
Und wenn Dir dann etwas einfach nicht in den Kopf will, dann frag' hier nach...
mutetella
Re: Kochbuch
Verfasst: Mittwoch 7. Oktober 2015, 09:47
von nono191
@all: Vielen Dank habs geschafft nur noch löschen ist das Problem... Könntet ihr mir nochmal helfen

?
Re: Kochbuch
Verfasst: Mittwoch 7. Oktober 2015, 10:06
von mutetella
@non191
Wenn Du mal zeigst, was Du bisher hast, kann man Dir hier auch gerne helfen. Einfach Deinen Code innerhalb code-tags posten...
mutetella
Re: Kochbuch
Verfasst: Mittwoch 7. Oktober 2015, 10:23
von nono191
@mutetela: Hab mal deins übernommen.
Re: Kochbuch
Verfasst: Mittwoch 7. Oktober 2015, 10:38
von mutetella
@nono191
Und auch verstanden, was da im Einzelnen passiert? Sonst macht das kaum Sinn, schon gleich neue Funktionalität einzubauen.
Ansonsten nochmal der Hinweis, die
Dokumentation zu bemühen. Auch wenn einen das erstmal erschlagen will... ohne Dokumentation lesen geht's einfach nicht. Jedenfalls wirst Du dort eine Methode finden, mit der Du Elemente aus einem
dictionary bzw. aus einer
Liste entfernen kannst. Und dann noch der Hinweis: Zum Hinzufügen hab' ich eine Funktion ``add`` erstellt, zum Entfernen würde ich eine Funktion ``remove`` schreiben.
mutetella
Re: Kochbuch
Verfasst: Mittwoch 7. Oktober 2015, 10:59
von nono191
@mutetella: Ich checke es im grossen und ganzen schon was ich nicht begreife: get_category, print "{:2d}: {}".format(item_number, item[0]), menu[choice][1](recipes).