To-do-list erstellen

Du hast eine Idee für ein Projekt?
Antworten
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Servus,
ich möchte in Python 3 eine To-do-list erstellen in die man Aufgaben einschreiben, entfehrnen und anzeigen lassen kann.
Soweit mein Code:

Code: Alles auswählen

#!/usr/bin/python3
import sys

def print_header():
    print("Wilkommen zu der Python 3 To-Do-List!")

    print("1 Aufgabe hinzufügen\n2 Aufgabe entfernen\n3 To-Do-Liste ansehen\n4 Exit")

def get_selection():

    auswahl = ""

    while auswahl == "":
        print_header()
        try:
            auswahl = int(input("\nWas wollen sie tun?\n"))
        except:
            print("Das ist keine Ganzzahl!")
            continue
        if auswahl < 1 or auswahl > 3:
            print("Dieser Menüpunkt steht nicht zur Auswahl!")
            auswahl = ""
        else:
            return auswahl


auswahl = get_selection()
todolist = {}


if auswahl == 1:
    name = input("Geben sie ihrem Task einen Namen:  ")
    
    todolist[name] = input("Beschreiben sie ihren Task:  ")
    get_selection()
    
if auswahl == 2:
    print("Dieser Menüpunkt ist noch nicht ausgebaut.")
    get_selection()
    
if auswahl == 3:
    print(todolist)
    get_selection()
            
if auswahl == 4:
    sys.exit(1)
Ich bin jetzt gerade erst am Anfang.. Wieso zeigt er mir die aber die Tasks die ich eingetragen habe nicht an?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

nfehren hat geschrieben:Wieso zeigt er mir die aber die Tasks die ich eingetragen habe nicht an?
Weil keine eingetragen sind... :wink:
Du verwendest für Deine Daten ein Dictionary, das nach jedem Aufruf von `get_selection` neu angelegt wird. Egal was Du da reinschreibst, es wird ja danach immer wieder neu angelegt...

Besser wäre es, wenn Du `todolist` nicht auf Modulebene vorhältst, sondern die Daten zwischen den Funktionen (die es so noch nicht gibt) weiterreichst.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

mutetella hat geschrieben:
nfehren hat geschrieben:Wieso zeigt er mir die aber die Tasks die ich eingetragen habe nicht an?
Weil keine eingetragen sind... :wink:
Du verwendest für Deine Daten ein Dictionary, das nach jedem Aufruf von `get_selection` neu angelegt wird. Egal was Du da reinschreibst, es wird ja danach immer wieder neu angelegt...

Besser wäre es, wenn Du `todolist` nicht auf Modulebene vorhältst, sondern die Daten zwischen den Funktionen (die es so noch nicht gibt) weiterreichst.

mutetella
Danke werde ich gleich probieren :)
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Soooooo das Ding funktioniert jetzt! :lol:
Jedoch will ich das Python die Aufgaben der To-Do-List in einem File abspeichert, dass diese nicht verloren gehen.
Könntet ihr mir da etwas helfen? Bin leider noch ein ziemlicher Anfänger.

Code: Alles auswählen

#!/usr/bin/python3
import sys

def print_header():
    print("\n\n###########################################")
    print("#    Willkommen zu Navid's To-Do-List!    #")
    print("###########################################\n\n\n")

    print("##########################\n\n   1 Aufgabe hinzufügen   \n   2 Aufgabe entfernen    ")
    print("  3 To-Do-Liste ansehen   \n         4 Exit           ")
    print("\n##########################")

def get_selection():

    auswahl = ""

    while auswahl == "":
        print_header()
        try:
            auswahl = int(input("\nWas wollen sie tun?\n"))
        except:
            print("Das ist keine Ganzzahl!")
            continue
        if auswahl < 1 or auswahl > 4:
            print("Dieser Menüpunkt steht nicht zur Auswahl!")
            auswahl = ""
        else:
            return auswahl


auswahl = get_selection()
todolist = {}

while auswahl != 4:

    if auswahl == 1:
        name = input("Geben sie ihrem Task einen Namen:  ")
        
        todolist[name] = input("Beschreiben sie ihren Task:  ")
    
    if auswahl == 2:
        print("Dieser Menüpunkt ist noch nicht ausgebaut.")
        
    if auswahl == 3:
        for k in todolist.keys():
            print("{0}: {1}".format(k,todolist[k]))
        
    auswahl = get_selection()
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@nfehren: Du solltest Deine while-Schleifen noch in "while True:"-Schleifen umwandeln. So wie sie jetzt dastehen, ist der Aufbau relativ kompliziert zu durchschauen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@nfehren: Schau' Dir mal das json Modul an.

Noch als Anregung: In Deiner `get_selection` fängst Du ausnahmslos alle Fehler ab, was man so nicht machen sollte. Wenn Du einen Fehler wie in diesem Fall einen `ValueError` behandeln möchtest, dann solltest Du auch nur diesen Fehler behandeln. Versuche z. B. einmal, die Eingabe durch Ctrl-C (das auch einen Fehler provoziert) zu unterbrechen, das wird nicht gehen. Das `continue` statement kannst Du an dieser Stelle ganz weglassen.

Vielleicht so:

Code: Alles auswählen

def get_selection(smallest, biggest):
    auswahl = None
    while True:
        try:
            auswahl = int(input('\nWas wollen sie tun?\n'))
        except ValueError:
            pass
        if not auswahl is None and not smallest <= auswahl <= biggest:
            print('Bitte geben Sie eine Zahl '
                  'zwischen {0} und {1} ein!'.format(smallest, biggest))
        else:
            return auswahl

Code: Alles auswählen

>>> get_selection(1, 4)

Was wollen sie tun?
0
Bitte geben Sie eine Zahl zwischen 1 und 4 ein!

Was wollen sie tun?
5
Bitte geben Sie eine Zahl zwischen 1 und 4 ein!

Was wollen sie tun?
3
3
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Da kann man noch das `None` für `auswahl` rausnehmen, sowohl die Zuweisung ganz am Anfang als auch den Test darauf. Ausnahmebehandlung kennt auch einen ``else``-Zweig nach ``except``. Da ist dann sichergestellt das es keine Ausnahme gab und dann ist sichergestellt, dass `auswahl` an eine ganze Zahl gebunden ist.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier mal eine Alternative, die ebenfalls ``None`` für die Kennzeichnung einer Ausnahme verwendet, aber IMHO eine etwas bessere Struktur hat:

Code: Alles auswählen

def get_selection(min_value, max_value):
    error_msg = (
        'Bitte geben Sie eine Zahl '
        'zwischen {} und {} ein.'.format(min_value, max_value)
    )
    while True:
        try:
            selection = int(input('\nWas wollen sie tun?\n'))
        except ValueError:
            selection = None
        if selection is None or not min_value <= selection <= max_value:
            print(error_msg)
        else:
            return selection
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Prima danke!
Aber wie kann ich die eingetragenen "todo's" auf einem file abspeichern, dass sie nach dem schließen noch da sind?
EDIT:
Beides klappt bei mir nicht..
Traceback (most recent call last):
File "/data/home/nfehren/bin/python/To-Do-List.py", line 28, in <module>
auswahl = get_selection()
TypeError: get_selection() takes exactly 2 arguments (0 given)
BlackJack

@nfehren: Die Fehlermeldung sagt doch ziemlich exakt was das Problem ist.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

nfehren hat geschrieben: Aber wie kann ich die eingetragenen "todo's" auf einem file abspeichern, dass sie nach dem schließen noch da sind?
mutetella hat geschrieben: @nfehren: Schau' Dir mal das json Modul an.
nfehren hat geschrieben: EDIT:
Beides klappt bei mir nicht..
Steht doch in der Fehlermeldung lesbar drin:
Traceback (most recent call last):
File "/data/home/nfehren/bin/python/To-Do-List.py", line 28, in <module>
auswahl = get_selection()
TypeError: get_selection() takes exactly 2 arguments (0 given)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich such mir auch mal meine Lieblingsschreibweise raus:

Code: Alles auswählen

def get_selection(min_value, max_value):
    while True:
        try:
            selection = int(input('\nWas wollen sie tun?\n'))
            assert min_value <= selection <= max_value
            return selection
        except (ValueError, AssertionError):
            print(
                'Bitte geben Sie eine Zahl '
                'zwischen {} und {} ein.'.format(min_value, max_value)
            )
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@Sirius3: Habe ich etwas übersehen oder soll dein Programm mit Absicht fehlerhaft sein? Eine Ausführung mit -O oder -OO wird irgendwie schwierig ...
Das Leben ist wie ein Tennisball.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Sirius: Wie's der Zufall wohl will, bin ich über G+ heute auf diesen Eintrag gestoßen. Ich trau' mir da jetzt keine Meinung zu...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten