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.fenetre) def generate_windows(self): self.fenetre=Tk() self.fenetre.title(string="cave a vin") etagere_frame=Frame(self.fenetre) for etagere in self.etageres: etagere.generate_frame(etagere_frame) framecontrol=LabelFrame(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() 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()