# Ni nujno, da se class imenuje enako kot datoteka, je pa to smiselna navada, ce imamo zgolj en class
class Task(object):
def __init__(self, title, done=False):
self.title = title
self.done = done
def output_nice(self):
if self.done:
return self.title + ": Done"
return self.title + ": Not done"
import pickle
from Task import Task
# Pripravimo malo boljsi program, ki omogoci, da si na koncu shranimo opravila
# Ideja dela:
# Uporabimo pickle, v tem primeru je datoteka sicer vecja, v primeru vecjih objektov pa je vecinoma manjsa, predvsem pa je serializacija lazja
# !!!! POZOR !!!! pri uporabi pickla je potrebno biti previden, ce datoteka prihaja iz drugih virov,
# saj lahko izvede poljubno python kodo, kar zna prinesti tezave...
# Pripravimo si pomozne spremenljivke
SAVED_FILE_NAME = "task_list_simple_pickle.txt" # koncnica .txt je popolnoma poljubna (lahko bi izbrali karkoli, a take koncnice prepozna in odpira vecina programov)
# Raje si naredmio pomozno funkcijo, saj je koda tako bolj berljiva
def load_saved():
# Manjsa tezavica, kaj naredimo, ce datoteka iz katere beremo se ne obstaja?
# Tole sicer presega snov, a ideja je sledeca:
# Poskusamo jo vseeno odpreti (try), in jo prebrati
# Ce pa gre kaj narobe, napako ulovimo (catch) in nadaljujemo z znanjem, da je slo nekaj narobe -> v nasem primeru ni datoteke
try:
# Preberemo datoteko za branje (crka "r"ead)
f = open(SAVED_FILE_NAME, "r")
# Uporabimo pickle, ki bo uspesno prebral, kaj je prej zapisal
tasks = pickle.load(f)
return tasks
except IOError:
print("NI NOBENE SHRANJENE DATOTEKE, ZACEL BOM S PRAZNO")
return []
def save_tasks(tasks_to_save):
# Odpremo z crko "w"rite (za pisanje)
# Tu ni tezav pri neobstojeci datoteki, saj jo bo sistem ustvaril sam, ce ne obstaja (prazno)
# !!POZOR, klic te funkcije zbrise vse kar je dosedaj bilo v tej datoteki POZOR!!
f = open(SAVED_FILE_NAME, "w")
# Preprosto zapisemo vse stvari v datoteko (pozor, tu so v ozadju podrobnosti, kako tocno zadeva funkcionira, kako je z import objektov...)
# Ampak celotna zadeva deluje preprosto
pickle.dump(tasks_to_save, f)
# D.N. preglej vsebimo pcikle datoteke, vecinoma je ni mogoce razumeti
# Datoteko zapremo, s tem zagotovimo, da se stvari res zapisejo vanjo in jo damo na voljo ostalim programom.
f.close()
load_old = raw_input("Ali zelis naloziti sharanjena opravila?")
if load_old == "da": # Preberemo stare
task_list = load_saved()
else: # Uporabimo prazen seznam
task_list = []
while 1:
title = raw_input("Vpisi naslednje opravilo")
print("Opraviti moras se: " + title)
done = raw_input("ali je opravilo opravljeno")
if done == "da":
# Opravljeno
task = Task(title, True)
else:
task = Task(title, False)
# V seznam dodamo trenut o opravilo
task_list.append(task)
end = raw_input("Zelis koncati (da/ne)?")
if end.lower() == "da":
break
print("POROCILO O OPRAVILIH")
print("Opravljena")
for sample_task in task_list:
if sample_task.done == True: # To bi lahko nadomestili kar z: if sample_task.done:
print(sample_task.title)
print("Neopravljena")
for sample_task in task_list:
if sample_task.done == False: # To bi lahko nadomestili kar z: if !sample_task.done: (Torej ce je res negacija sample_task.done)
print(sample_task.title)
print("Vsa opravila")
# Izpisemo vsa opravila (ne glede na njihovo opravljenost) s pomocjo definirane funkcije
for sample_task in task_list:
print(sample_task.output_nice())
# DN: vprasaj uporabnika, ali res zeli shraniti nova opravila (in upostevaj njegovo zeljo)
print("SHRANUJEM")
save_tasks(task_list)
print("SHRANJEVANJE KONCANO")
from Task import Task
# Pripravimo malo boljsi program, ki omogoci, da si na koncu shranimo opravila
# Ideja dela:
# Preden zacnemo, uporabnika vprasamo, ali zeli naloziti ze prej shranjena opravila
# Na koncu prepisemo stara opravila
# DN: Razmisli, kako bi dodal v stara opravila (namig: poglej dokumentacijo funkcije open)
# Pripravimo si pomozne spremenljivke
# Po dogovoru konstante (spremenljivke, ki jih nocemo spreminjati) pisemo Z_VELIKIMI_CRKAMI (tako dodatno povemo, da gre za konstanto)
SAVED_FILE_NAME = "task_list_simple.txt" # koncnica .txt je popolnoma poljubna (lahko bi izbrali karkoli, a take koncnice prepozna in odpira vecina programov)
# Raje si naredmio pomozno funkcijo, saj je koda tako bolj berljiva
def load_saved():
# Manjsa tezavica, kaj naredimo, ce datoteka iz katere beremo se ne obstaja?
# Tole sicer presega snov, a ideja je sledeca:
# Poskusamo jo vseeno odpreti (try), in jo prebrati
# Ce pa gre kaj narobe, napako ulovimo (catch) in nadaljujemo z znanjem, da je slo nekaj narobe -> v nasem primeru ni datoteke
try:
# Preberemo datoteko za branje (crka "r"ead)
f = open(SAVED_FILE_NAME, "r")
# To ja zgolj zacasna spremenljivka, ki jo bomo vrnili
tasks = []
# Gremo po vseh vrsticah
for line in f:
# Vemo, da so vrstice oblike: title,dokoncanost
# Zato jih locimo po vejici, in vsako zapisemo v svoj del
title, done = line.split(",")
if done == "True":
task = Task(title, True)
else:
task = Task(title, False)
tasks.append(task)
return tasks
except IOError:
print("NI NOBENE SHRANJENE DATOTEKE, ZACEL BOM S PRAZNO")
return []
def save_tasks(tasks_to_save):
# Odpremo z crko "w"rite (za pisanje)
# Tu ni tezav pri neobstojeci datoteki, saj jo bo sistem ustvaril sam, ce ne obstaja (prazno)
# !!POZOR, klic te funkcije zbrise vse kar je dosedaj bilo v tej datoteki POZOR!!
f = open(SAVED_FILE_NAME, "w")
for task in tasks_to_save:
# Posamezeno opravilo zapisemo v datoteko, loceno z vejico, na koncu opravila pa novo vrstico
f.write(task.title + "," + str(task.done) + "\n")
# Datoteko zapremo, s tem zagotovimo, da se stvari res zapisejo vanjo in jo damo na voljo ostalim programom.
f.close()
load_old = raw_input("Ali zelis naloziti sharanjena opravila?")
if load_old == "da": # Preberemo stare
task_list = load_saved()
else: # Uporabimo prazen seznam
task_list = []
while 1:
title = raw_input("Vpisi naslednje opravilo")
print("Opraviti moras se: " + title)
done = raw_input("ali je opravilo opravljeno")
if done == "da":
# Opravljeno
task = Task(title, True)
else:
task = Task(title, False)
# V seznam dodamo trenut o opravilo
task_list.append(task)
end = raw_input("Zelis koncati (da/ne)?")
if end.lower() == "da":
break
print("POROCILO O OPRAVILIH")
print("Opravljena")
for sample_task in task_list:
if sample_task.done == True: # To bi lahko nadomestili kar z: if sample_task.done:
print(sample_task.title)
print("Neopravljena")
for sample_task in task_list:
if sample_task.done == False: # To bi lahko nadomestili kar z: if !sample_task.done: (Torej ce je res negacija sample_task.done)
print(sample_task.title)
print("Vsa opravila")
# Izpisemo vsa opravila (ne glede na njihovo opravljenost) s pomocjo definirane funkcije
for sample_task in task_list:
print(sample_task.output_nice())
# DN: vprasaj uporabnika, ali res zeli shraniti nova opravila (in upostevaj njegovo zeljo)
print("SHRANUJEM")
save_tasks(task_list)
print("SHRANJEVANJE KONCANO")
# Tezava takega nacina je v tem, da moramo vedno natancno vedeti, kako opravila shranjujemo
# Ena se malo dfugacna tezava je v primeru, ko naslov opravila vsebuje vejico ","
# Razmisli, kako bi lahko postopal v tem primeru
from Task import Task
# Pripravimo prazen seznam
task_list = []
while 1:
title = raw_input("Vpisi naslednje opravilo")
print("Opraviti moras se: " + title)
done = raw_input("ali je opravilo opravljeno")
if done == "da":
# Opravljeno
task = Task(title, True)
else:
task = Task(title, False)
# V seznam dodamo trenut o opravilo
end = raw_input("Zelis koncati (da/ne)?")
if end.lower() == "da":
break
print("POROCILO O OPRAVILIH")
print("Opravljena")
for sample_task in task_list:
if sample_task.done == True: # To bi lahko nadomestili kar z: if sample_task.done:
print(sample_task.title)
print("Neopravljena")
for sample_task in task_list:
if sample_task.done == False: # To bi lahko nadomestili kar z: if !sample_task.done: (Torej ce je res negacija sample_task.done)
print(sample_task.title)
print("Vsa opravila")
# Izpisemo vsa opravila (ne glede na njihovo opravljenost) s pomocjo definirane funkcije
for sample_task in task_list:
print(sample_task.output_nice())