Realizarea unei liste de sarcini (To-Do List)
Construiește pas cu pas o aplicație To-Do List în Python: adaugi, ștergi și marchezi sarcini, cu salvare în fișier JSON ca să nu se piardă datele.
O listă de sarcini (To-Do List) e unul dintre cele mai utile proiecte de început. E suficient de simplu cât să-l termini, dar te învață ceva esențial: cum salvezi date ca să nu dispară când închizi programul. Hai să-l construim.
Ce vom face
O aplicație de terminal care:
- afișează sarcinile, cu bifă pentru cele terminate;
- adaugă o sarcină nouă;
- marchează o sarcină ca finalizată;
- șterge o sarcină;
- salvează totul într-un fișier ca să rămână de la o rulare la alta.
Pasul 1: cum reprezentăm o sarcină
Fiecare sarcină are un text și o stare (gata sau nu). Un dicționar e perfect:
sarcina = {"text": "Învață Python", "gata": False}
Toate sarcinile vor sta într-o listă de astfel de dicționare.
Pasul 2: salvare și încărcare cu JSON
Ca să nu pierdem datele, le scriem într-un fișier sarcini.json. Modulul json transformă lista noastră în text și înapoi:
import json
FISIER = "sarcini.json"
def incarca():
try:
with open(FISIER, "r", encoding="utf-8") as f:
return json.load(f)
except FileNotFoundError:
return [] # prima rulare: listă goală
def salveaza(sarcini):
with open(FISIER, "w", encoding="utf-8") as f:
json.dump(sarcini, f, ensure_ascii=False, indent=2)
try / except ne salvează la prima rulare, când fișierul nu există încă: returnăm o listă goală în loc să crăpăm.
Pasul 3: afișarea sarcinilor
Arătăm lista numerotată, cu o bifă pentru ce e gata:
def afiseaza(sarcini):
if not sarcini:
print("Nu ai nicio sarcină. Felicitări!")
return
for i, s in enumerate(sarcini, start=1):
bifa = "[x]" if s["gata"] else "[ ]"
print(f"{i}. {bifa} {s['text']}")
Pasul 4: adăugare, marcare, ștergere
Trei funcții scurte care modifică lista:
def adauga(sarcini, text):
sarcini.append({"text": text, "gata": False})
def marcheaza(sarcini, numar):
if 1 <= numar <= len(sarcini):
sarcini[numar - 1]["gata"] = True
def sterge(sarcini, numar):
if 1 <= numar <= len(sarcini):
sarcini.pop(numar - 1)
Verificăm mereu că numărul e valid, ca utilizatorul să nu provoace o eroare cu un index inexistent.
Pasul 5: meniul principal
Legăm totul într-o buclă care cere comenzi până când utilizatorul iese. La fiecare modificare, salvăm:
def main():
sarcini = incarca()
while True:
print("\n--- To-Do List ---")
afiseaza(sarcini)
print("\nComenzi: adauga / gata / sterge / iesi")
comanda = input("> ").strip().lower()
if comanda == "adauga":
text = input("Text sarcină: ")
adauga(sarcini, text)
elif comanda == "gata":
nr = int(input("Număr sarcină: "))
marcheaza(sarcini, nr)
elif comanda == "sterge":
nr = int(input("Număr sarcină: "))
sterge(sarcini, nr)
elif comanda == "iesi":
break
else:
print("Comandă necunoscută.")
salveaza(sarcini) # salvăm după fiecare schimbare
main()
Cum îl rulezi
Pune codul într-un fișier todo.py și rulează:
# în terminal:
# python todo.py
Adaugă câteva sarcini, închide programul, redeschide-l — sunt încă acolo. Asta e magia salvării în fișier.
Momentul în care vezi datele rămase după ce ai închis aplicația e momentul în care simți că ai construit ceva real.
Idei de extindere
| Funcție | Cum |
|---|---|
| Priorități | adaugă un câmp prioritate și sortează după el |
| Termen-limită | salvează o dată și avertizează la cele apropiate |
| Categorii | grupează sarcinile (școală, acasă, hobby) |
| Interfață grafică | reconstruiește cu tkinter pentru butoane reale |
Recapitulare
Ai învățat liste, dicționare, citire și scriere în fișiere, tratarea erorilor și o buclă de meniu. Astea sunt cărămizile oricărei aplicații serioase.
La ByteSchool construim proiecte ca acesta împreună, pas cu pas, cu mentori care au lucrat în Big Tech. Te ducem de la primele linii de cod până la aplicații pe care le folosești zi de zi.