Kochbuch

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.
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

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?
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?
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

@BlackJack: Genau das ist mein problem.
BlackJack

@nono191: Was denn jetzt *genau*? Was für Daten hast Du? Typen, Struktur, …? Würde JSON als Format ausreichen?
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

@BlackJack: Ich speichere sie gar nicht.
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

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)
Zuletzt geändert von Anonymous am Dienstag 6. Oktober 2015, 14:32, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
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.
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

@BlackJack: Merci, verwende diese Programmiersprache noch nicht lange :D :K .
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

@BlackJack: Wie geht das mit JSON genau?
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?
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

@BlackJack: Welche Dokumentation?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

nono191 hat geschrieben:@BlackJack: Welche Dokumentation?
Die offizielle Dokumentation zu json.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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...
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

@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 :oops: :K . Das wär mega nett.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

@all: Vielen Dank habs geschafft nur noch löschen ist das Problem... Könntet ihr mir nochmal helfen :oops: ?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@non191
Wenn Du mal zeigst, was Du bisher hast, kann man Dir hier auch gerne helfen. Einfach Deinen Code innerhalb code-tags posten...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

@mutetela: Hab mal deins übernommen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
nono191
User
Beiträge: 38
Registriert: Dienstag 6. Oktober 2015, 13:01

@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).
Antworten