cave/cave.py

252 lines
9.2 KiB
Python

import json
from tkinter import *
class Etageres(object):
def __init__(self):
self.etageres = []
self.nbetagere = 0
self.couleur = {"rouge":"red","blanc":"white","rose":"pink"}
@classmethod
def load_etageres(cls,file):
try:
with open(file, 'rb') as json_data:
data=json.load(json_data)
except FileNotFoundError:
print ("no file to load")
return Etageres()
loadobj=Etageres()
for etagere in data["etageres"]:
print("etagere:")
print (etagere)
loadobj.add_etagere(etagere["largeur"],etagere["hauteur"])
for bouteille in etagere["bouteilles"]:
loadobj.etageres[loadobj.nbetagere-1].add_bouteille(bouteille["pos_largeur"],bouteille["pos_hauteur"],bouteille["couleur"],bouteille["millesime"],bouteille["appelation"])
return loadobj
def add_etagere(self, largeur, hauteur):
self.nbetagere += 1
self.etageres.append(Etagere (largeur, hauteur, self))
def click_add_etagere(self):
child_window=Toplevel(self.fenetre)
Label(child_window,text="select largeur").pack()
largeur=StringVar()
Entry(child_window,textvariable=largeur).pack()
Label(child_window,text="hauteur").pack()
hauteur=StringVar()
Entry(child_window,textvariable=hauteur).pack()
Button(child_window,text="OK",command=lambda:add(largeur.get(),hauteur.get())).pack()
def add(largeur,hauteur):
child_window.destroy()
self.nbetagere += 1
newetagere=Etagere(int(largeur),int(hauteur),self)
self.etageres.append(newetagere)
newetagere.generate_frame(self.etagere_frame)
def generate_windows(self):
self.fenetre=Tk()
self.fenetre.title(string="cave a vin")
self.etagere_frame=Frame(self.fenetre)
for etagere in self.etageres:
etagere.generate_frame(self.etagere_frame)
framecontrol=LabelFrame(self.etagere_frame,text="command pannel")
framecontrol.grid(column=2,row=1)
Button(framecontrol,text="add etagere",command=lambda:self.click_add_etagere()).pack()
Button(framecontrol,text="remove etagere").pack()
Button(framecontrol,text="save",command=lambda:self.save_etageres("cave")).pack()
self.etagere_frame.grid(column=1,row=1)
scrollbar = Scrollbar(self.fenetre,orient=VERTICAL)
scrollbar.grid(column=2,row=1,sticky=N+S)
def mainloop(self):
self.fenetre.mainloop()
def nbbouteille(self):
i = 0
for etagere in self.etageres:
for bouteille in etagere:
i += 1
return i
def nbbouteillecouleur(self, couleur):
i = 0
for etagere in self.etageres:
for bouteille in etagere:
if bouteille.couleur == couleur:
i += 1
return i
def remove_etagere(self, etagere):
self.etageres.remove(etagere)
self.nbetagere -= 1
return "etagere {} suprimer".format(etagere.num_etagere)
def save_etageres(self,file):
with open(file, 'w') as output:
data={"etageres":[]}
for etagere in self.etageres:
data["etageres"].append(etagere.save())
print(data)
json.dump(data,output,indent=4)
print ("save ok")
def __iter__(self):
return iter(self.etageres)
class Etagere(object):
def __init__(self, largeur, hauteur, etageres):
self.num_etagere = etageres.nbetagere
self.largeur = largeur
self.hauteur = hauteur
self.etageres = etageres
self.bouteilles = []
def add_bouteille(self, pos_largeur, pos_hauteur, couleur, appelation, millesime):
for bouteille in self.bouteilles:
if (pos_hauteur > self.hauteur or pos_largeur > self.largeur or pos_largeur < 1 or pos_largeur < 1):
return "bouteille positioné en dehors des emplacement"
if (pos_largeur == bouteille.pos_largeur and pos_hauteur == bouteille.pos_hauteur):
return "une bouteille existe déja a cette emplacement"
self.bouteilles.append(Bouteille(pos_largeur, pos_hauteur, couleur, appelation, millesime, self))
return "OK"
def remove_bouteille(self, pos_largeur, pos_hauteur):
i = 0
for bouteille in self.bouteilles:
if (pos_largeur == bouteille.pos_largeur and pos_hauteur == bouteille.pos_hauteur):
self.bouteilles.remove(bouteille)
return ( "bouteille suprimé")
else:
i += 1
return ( "aucune bouteille troué a cette emplacement")
def generate_frame(self,root):
self.frame=LabelFrame(root,text=self)
for hauteur in range(self.hauteur):
for largeur in range(self.largeur):
isset = False
for bouteille in self:
if (largeur == bouteille.pos_largeur and hauteur == bouteille.pos_hauteur):
bouteille.generate_boutton(self.frame)
isset = True
break
if isset == False:
Cassier_vide(largeur,hauteur,self)
self.frame.grid(row=self.num_etagere)
def click_remove_bouteille(self,bouteille):
self.remove_bouteille(bouteille.pos_largeur, bouteille.pos_hauteur)
bouteille.boutton.destroy()
Cassier_vide(bouteille.pos_largeur,bouteille.pos_hauteur,self)
self.frame["text"]=self
def click_add_bouteille(self,cassiervide):
child_window=Toplevel(self.etageres.fenetre)
Label(child_window,text="select color").pack()
couleur=StringVar()
couleur.set("rouge")
OptionMenu(child_window,couleur,*self.etageres.couleur.keys()).pack()
Label(child_window,text="enter millesime").pack()
millesime=StringVar()
Entry(child_window,textvariable=millesime).pack()
Label(child_window,text="enter appelation").pack()
appelation=StringVar()
Entry(child_window,textvariable=appelation).pack()
Button(child_window,text="OK",command=lambda:add(cassiervide,couleur.get(),millesime.get(),appelation.get())).pack()
def add(cassiervide,couleur,millesime,appelation):
child_window.destroy()
newbouteille=Bouteille(cassiervide.pos_largeur, cassiervide.pos_hauteur, couleur, appelation, millesime, self)
self.bouteilles.append(newbouteille)
cassiervide.boutton.destroy()
del cassiervide
newbouteille.generate_boutton(self.frame)
self.frame["text"]=self
def save(self):
data={"largeur": self.largeur,"hauteur": self.hauteur,"bouteilles":[]}
for bouteille in self.bouteilles:
data["bouteilles"].append(bouteille.save())
return data
def __repr__(self):
return "etagére numéros {} de largeur {} et de hauteur {} et contient {} bouteille(s) ".format(self.num_etagere, self.largeur, self.hauteur, len(self.bouteilles))
def __iter__(self):
return iter(self.bouteilles)
class Cassier_vide(object):
def __init__(self, pos_largeur, pos_hauteur,etagere):
self.pos_largeur = pos_largeur
self.pos_hauteur = pos_hauteur
self.etagere = etagere
self.boutton=Button(etagere.frame,text="cassier vide",command=lambda:self.etagere.click_add_bouteille(self))
self.boutton.grid(row=self.pos_hauteur,column=self.pos_largeur)
class Bouteille(object):
def __init__(self, pos_largeur, pos_hauteur, couleur, appelation, millesime, etagere):
self.pos_largeur = pos_largeur
self.pos_hauteur = pos_hauteur
self.couleur = couleur
self.millesime = millesime
self.appelation = appelation
self.etagere = etagere
def generate_boutton(self,frame):
self.boutton=Button(frame,text=self,command=lambda:self.etagere.click_remove_bouteille(self))
self.boutton["bg"]=self.etagere.etageres.couleur[self.couleur]
self.boutton.grid(row=self.pos_hauteur,column=self.pos_largeur)
def save(self):
data={ "pos_largeur" : self.pos_largeur,"pos_hauteur" : self.pos_hauteur, "couleur" : self.couleur, "millesime" : self.millesime,"appelation" : self.appelation}
return data
def __repr__(self):
return "{},{} \n".format(self.appelation, self.millesime)
new = Etageres.load_etageres("cave")
#new =Etageres()
#new.add_etagere(10, 3)
#new.add_etagere(4,4)
#print(new.etageres[0].add_bouteille(1, 1, "rouge", "saint emilion", 2005))
#print(new.etageres[0].add_bouteille(9, 1, "rose", "gewurtz", 2010))
#print(new.etageres[0].add_bouteille(5, 2, "rouge", "saint emilion", 2006))
#print(new.etageres[0].bouteilles)
#print("vos etagére contiennes {} bouteille".format(new.nbbouteille()))
#print("vos etagére contiennes {} bouteille de rouge".format(
#new.nbbouteillecouleur("rouge")))
#print(new.couleur)
new.generate_windows()
new.mainloop()