Ten wpis powstaje w ramach wyzwania Summer Of Code jako podsumowanie 3 tygodnia wyzwania! W tym tygodniu, co udało nam się osiągnąć to przejście od zera do pisania własnych skryptów w Pythonie z wykorzystaniem fundamentalnych koncepcji programowania.
Zadanie łączące podstawy programowania w Pythonie takie jak:
- typy i zmienne
- instrukcje warunkowe
- pętle
- funkcje
- moduły
- zapis do pliku
…chociaż myślę, że to zadanie również dla średniozaawansowanych w pythonie, które można dalej rozbudowywać wg. własnego poziomu (np. dodać obsługę wyjątków, OOP itd).
Czas na klasyk, czyli TODO listę w Pythonie na zakończenie tygodnia nauki
PROJEKT KOŃCOWY
Zadanie: Notatnik zadań
Twoim zadaniem jest stworzenie prostego notatnika zadań w Pythonie (to-do list), który będzie umożliwiał użytkownikowi dodawanie nowych zadań, oznaczanie ich jako wykonane i zapisywanie ich do pliku.
Wymagane funkcje notatnika zadań:
- Dodawanie nowego zadania: Użytkownik może wprowadzić opis nowego zadania, a program powinien zapisać je w liście zadań.
- Wyświetlanie listy zadań: Użytkownik może wyświetlić listę wszystkich zadań w terminalu.
- Oznaczanie zadania jako wykonane: Użytkownik może oznaczyć zadanie jako wykonane, co wpłynie na jego status w liście zadań (np. zmienna typu bool – true/false).
- Zapisywanie do pliku: Po zakończeniu pracy z notatnikiem, lista zadań powinna zostać zapisana do pliku tekstowego (albo csv), tak, aby można było ją ponownie odczytać przy kolejnym uruchomieniu programu.
- Odczyt z pliku: (opcjonalnie) Po ponownym uruchomieniu możliwość odczytania listy zadań z pliku tekstowego.
Biblioteki, które można wykorzystać:
datetime: Do dodawania daty i czasu wykonania zadania, albo „do kiedy” (wg. uznania)- (opcjonalnie)
os: Do sprawdznia czy dany plik istnieje zanim spróbujemy go otworzyć
Wskazówki:
- Rozpocznij od stworzenia prostego menu dla użytkownika, które umożliwi dodawanie, wyświetlanie i oznaczanie zadań (te operacje będą funkcjami).
- Wykorzystaj pętlę while, aby umożliwić użytkownikowi wykonanie wielu operacji przed zamknięciem notatnika.
- Zadbaj o strukturę danych np. przechowuj listę zadań w formie słownika, gdzie kluczami będą numery indeksów, a wartościami będą opisy zadań.
- Po zakończeniu pracy z notatnikiem, zapisz listę zadań do pliku tekstowego za pomocą biblioteki os.
Pseudokod
Jak może wyglądać kolejność instrukcji w tym zadaniu?
Utwórz strukturę dla zadań np. słownik
Funkcja display_menu:
Wyświetl opcje menu
Funkcja add_task:
Weź opis zadania od użytkownika
Weź aktualną datę i czas
Dodaj zadanie do słownika 'tasks' z datą i statusem do zrobienia
Funkcja display_tasks:
Dla każdego zadania w 'tasks', wyświetl indeks, opis, datę i status
Funkcja mark_task_done:
Weź indeks zadania od użytkownika
Zmień status zadania na 'wykonane'
Funkcja save_tasks_to_file:
Otwórz plik do zapisu
Dla każdego zadania w 'tasks', zapisz indeks, opis, datę i status do pliku
Zamknij plik
Główna pętla programu:
Wyświetl menu
Weź wybór od użytkownika
Jeśli użytkownik wybrał 'dodaj zadanie', wywołaj funkcję add_task
Jeśli użytkownik wybrał 'wyświetl zadania', wywołaj funkcję display_tasks
Jeśli użytkownik wybrał 'oznacz zadanie jako wykonane', wywołaj funkcję mark_task_done
Jeśli użytkownik wybrał 'zapisz zadania do pliku', wywołaj funkcję save_tasks_to_file
Jeśli użytkownik wybrał 'wyjdź', zakończ pętlę
Pseudokod w tym wypadku to koncepcja kodu, która może pomóc w pracy nad projektem. Pamiętaj to tylko sugestia, istnieje więcej niz jedno dobre rozwiązanie (np. brakuje jeszcze odczytu z pliku)
Fajny challange. Można poćwiczyć – zwłaszcza jak się utknęło na ciągłym robieniu tutoriali.
Moja propozycja (wersja nie ostateczna):
import datetime import os def display_menu(): """Displays Menu""" print("""1. Add task \n2. Show tasks \n3. Mark as completed \n4. Save to file \n5.quit """) list_of_tasks = {} def read_last_item(): """Finds last key in dictionary""" global last_key try: last_key = list(list_of_tasks)[-1] + 1 return last_key except IndexError: last_key = 1 return last_key def add_task(): """Adds task to dictionary""" read_last_item() task = input("Add task: ") task_date = str(datetime.date.today()) list_of_tasks[last_key] = {"task": task, "data": task_date, "completed": False} print("Task added") def show_list_of_tasks(): """Show current list of tasks""" for key, value in list_of_tasks.items(): print(f"Task: {list_of_tasks[key]['task']},Data: {list_of_tasks[key]['data']}, Completed: {list_of_tasks[key]['completed']}") def mark_task_done(): """Mark task as done - given by user""" indeks = int(input("Give index for task to mark as done: ")) for key, value in list_of_tasks.items(): if indeks == key: value["completed"] = True print(key,value["task"], value['completed']) print("Task marked as completed") # Main loop while True: try: display_menu() chosen_option = int(input("What would you like to do? >>")) if chosen_option == 1: add_task() elif chosen_option == 2: show_list_of_tasks() elif chosen_option == 3: mark_task_done() elif chosen_option == 5: break except ValueError: print("Only number option!")