ToDo-Liste

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Bananradrama
User
Beiträge: 2
Registriert: Montag 6. Januar 2020, 17:45

Hallo Community,

Ich hoffe ich bin in diesem Thread richtig. Ich bin seit ein paar Wochen dabei Python zu lernen. Nun wollte ich mir zum Üben eine ToDo-Liste erstellen, welche in eine CSV-Datei ausgelagert ist. Die einzelnen ToDo's habe ich mittels einer ToDo-Klasse angelegt, welche in einem Code ausgelagert ist. Ich habe es geschafft, dass eine Todo angelegt werden kann sowie, dass alle ToDo's bzw. welche bis zu einem Stichtag angezeigt werden können. Beim Punkt den Text einer ToDo anhand seiner ID zu ändern hänge ich allerdings. Meiner Meinung nach müsste ich die CSV in reinladen, im Memory bearbeiten und dann die bearbeitete Version über die alte CSV speichern. Dies funktioniert jedoch bei mir nicht. Könnt Ihr mir hierbei helfen?

Danke für eure Unterstützung.

mfg
Bananradrama

Code ToDo-Klasse:

Code: Alles auswählen

class todoLine:
    def __init__(self, ID, text, actualDate, deadline, status):
        self.ID = ID #automatische ID
        self.text = text #Freitext für TODO
        self.actualDate = actualDate #Aktualdatum damit Tage berechnet werden können
        self.deadline = deadline #Deadline Datum
        self.status = status #offen/erledigt
Code Hauptprogramm:

Code: Alles auswählen

import todo_data
import csv
import sys
import datetime
import pandas as pd
from todo_data import todoLine

#functions
def load_csv(path_to_todo):
    with open (path_to_todo) as todo_file:
        reader = csv.reader(todo_file, delimiter = ';')
        for line in reader:
            ToDo.append(todoLine(line[0], line[1], line[2], line[3], line[4]))
            year, month, day = map(int, line[3].split('-'))
            line[3] = datetime.date(year, month, day)
        



# Eingabeaufforderung
def print_menu():
    print("")
    print("")
    print("##############")
    print("ToDo Liste deluxe")
    print("##############")

    print("neu - Anlegen von ToDo's")
    print("alle - Ausgabe aller ToDo's")
    print("bis - Ausgabe von ToDo's bis zu einem Stichtag")
    print("aendern - Ändere eine deiner ToDo's")
    print("erledigt - setze eine ToDo auf erledigt")
    print("quit - Beenden der Applikation")
    print("---")


#Funktion Anlegen von ToDo's
    #-Einlesen - erledigt mit Funktion zu Beginn des Programmes
    #-neue ToDo anhängen

def anlegen_ToDo():
    neue_ToDo = [input("Bitte geben Sie eine noch nicht vorhandene Zahl als ID ein: "), input("Bitte geben Sie den Namen Ihrer ToDo ein:"), input("Bitte geben Sie das aktuelle Datum im Format YYYY-MM-DD ein: "), input ("Bitte geben Sie eine Deadline im Format YYY-MM-DD ein: "), input ("Bitte geben Sie offen oder erledigt ein: ")]
    
    with open('todo.csv', 'a', newline='') as todo_file:
        writer = csv.writer(todo_file, delimiter = ';')
        writer.writerow(neue_ToDo)

#Funktion Ausgabe aller ToDo's
def anzeigen_ToDo():
    with open('todo.csv', 'r') as todo_file:
        reader = csv.reader(todo_file, delimiter = ';')
        for line in reader:
            print(line)
 


#Funktion Ausgabe aller ToDo's bis zu einem Tag
def anzeigen_Stichtag(deadline):
    for cur_ToDo in ToDo:
        year, month, day = map(int, cur_ToDo.deadline.split('-'))
        cur_ToDo.deadline = datetime.date(year, month, day)
        if cur_ToDo.deadline <= deadline:
            print(str(cur_ToDo.ID) + " " + str(cur_ToDo.text) + " " + str(cur_ToDo.status))
    

#Funktion Ändern ToDo auf Basis ID
def aendern_ToDo_Text(Id):
    with open('todo.csv', 'r') as todo_file:
        reader = csv.reader(todo_file, delimiter = ';')
        for line in reader:
            print(line)
            if Id == line.ID:
                line.text = input("Bitte geben Sie eine neue Beschreibung ein: ")
   # todo_file = csv.reader(open('todo.csv'), delimiter = ';')
    #lines = list(todo_file)
        #for line in lines:
            #if cur_ID == Id:
            #todoLine.text = input("Bitte geben Sie eine neue Beschreibung ein:")
    #writer = csv.writer(open("todo.csv")):
     #   writer = csv.writer(reader, delimiter = ';')
      #  writer.writerows(todo_file)




#Funktion ToDo als erledigt markieren
#tbd


# main program


ToDo = []
load_csv("todo.csv")


while True:
    print_menu()

    user_command = input("Bitte geben Sie einen Befehl ein:")

    if user_command == "neu":
        anlegen_ToDo()
    elif user_command == "alle":
        anzeigen_ToDo()
    elif user_command == "bis":
        deadline1 = input("Bitte geben Sie die gewünschte Deadline ein:")
        year, month, day = map(int, deadline1.split('-'))
        deadline1 = datetime.date(year, month, day)
        anzeigen_Stichtag(deadline1)
    elif user_command == "aendern":
        ID_aendern = input("Bitte geben Sie die ID ein :")
        aendern_ToDo_Text(ID_aendern)
    elif user_command == "erledigt":
        <tbd>
    elif user_command == "quit":
        break
    else:
        print("Falsche Eingabe")


Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablennamen schreibt man wie Funktionsnamen klein_mit_unterstrich, Klassen dagegen mit GrossemAnfangsbuchstaben. sys, todo_data und pandas wird importiert, aber nicht benutzt.
In `load_csv` macht das Erzeugen des Datums keinen Sinn, weil zu spät. Zum Parsen gibt es datetime.datetime.strptime: `datetime.datetime.strptime('2020-01-06', '%Y-%m-%d')`. `ToDo` sollte keine globale Liste sein, sondern ein Rückgabewert.

In `anlegen_ToDo` ist die Zeile mit `neue_ToDo` viel zu lang.
Den Fehler, den Du in `load_csv` machst, versucht Du in `anzeigen_Stichtag` wieder auszubügeln, da ist es aber die falsche Stelle.
Strings stückelt man nicht mit ›str‹ und + zusammen, sondern benutzt Format-Strings.
In `aendern_ToDo_Text` ist `line` kein Typ der Klasse todoLine, sondern eine Liste.
Alles, was nach dem Kommentar `main program` steht, sollte in eine Funktion, die `main` heißt.
"todo.csv" kommt etliche male im Programm vor und sollte einmal als Konstante definiert werden.
Bananradrama
User
Beiträge: 2
Registriert: Montag 6. Januar 2020, 17:45

Hallo Sirius,

vielen Dank für deine rasche Antwort. Werd gleich mal einiges ausbessern.
Mittels pandas hätte ich versucht den Punkt "aendern" also die def "aendern_Todo_Text" zu ermöglichen da ich in einigen Foren davon gelesen habe. Allerdings hat das auch nicht wirklich geklappt. Hab dann vergessen es oben rauszulöschen.

Hast du noch eine Idee wie ich das Problem im Punkt "aendern_Todo_Text" richtig hinbekomme, also das hereinladen, abändern und wieder rausspeichern der upgedateten Werte?

Dankeschön :)

mfg
Bananradrama
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wo kommst Du bei aendern_ToDo_Text nicht weiter? Das Vorgehen ist, 1. alles lesen, 2. ändern, 3. schreiben.
Antworten