import json from tkinter import Scrollbar,Label,LabelFrame,Entry,Button,OptionMenu,StringVar,Canvas,Toplevel,N,S,VERTICAL,Tk,Frame class Etageres(object): def __init__(self): self.etageres = [] self.nbetagere = 0 self.couleur = {"rouge": "red", "blanc": "white", "rose": "pink", "champagne": "yellow"} @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 newetagere = Etagere(largeur, hauteur, self) self.etageres.append(newetagere) return newetagere def nbbouteille(self): i = 0 for etagere in self.etageres: i += len(etagere.bouteilles) 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, num_etagere): for etagere in self.etageres: if etagere.num_etagere == num_etagere: self.etageres.remove(etagere) return 0 return "pas d'étagere a ce numéros" 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): if (pos_hauteur > self.hauteur or pos_largeur > self.largeur or pos_hauteur < 0 or pos_largeur < 0): return "bouteille positioné en dehors des emplacement" for bouteille in self.bouteilles: if (pos_largeur == bouteille.pos_largeur and pos_hauteur == bouteille.pos_hauteur): return "une bouteille existe déja a cette emplacement" newbouteille = Bouteille( pos_largeur, pos_hauteur, couleur, appelation, millesime, self) self.bouteilles.append(newbouteille) return newbouteille 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 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 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 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 "{},{} ".format(self.appelation, self.millesime) class EtageresUI(Tk): def __init__(self, etageres): Tk.__init__(self) self.etageres = etageres self.title(string="cave a vin") self.etageresUI = [] self.mainframe=Frame(self) vscrollbar = Scrollbar(self.mainframe, orient=VERTICAL) self.etagere_frame = Canvas(self.mainframe, yscrollcommand=vscrollbar.set,width=1000,height=1000) for etagere in self.etageres: newetagere=EtagereUI(etagere, self) self.etageresUI.append(newetagere) self.etagere_frame.config(scrollregion=self.etagere_frame.bbox("all")) vscrollbar.grid(column=2, row=1, sticky=N+S) vscrollbar.config(command=self.etagere_frame.yview) framecontrol = LabelFrame(self.mainframe, text="command pannel") framecontrol.grid(column=3, row=1) Button(framecontrol, text="add etagere", command=self.click_add_etagere).pack() Button(framecontrol, text="remove etagere", command=self.click_remove_etagere).pack() Button(framecontrol, text="save", command=lambda: self.etageres.save_etageres("cave")).pack() self.etagere_frame.grid(column=1, row=1) self.mainframe.grid() def click_add_etagere(self): child_window = Toplevel(self) 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() newetagere = self.etageres.add_etagere(int(largeur), int(hauteur)) self.etageresUI.append(EtagereUI(newetagere, self)) self.etagere_frame.config(scrollregion=self.etagere_frame.bbox("all")) def click_remove_etagere(self): child_window = Toplevel(self) Label(child_window, text="select etagere").pack() num = StringVar() Entry(child_window, textvariable=num).pack() Button(child_window, text="OK", command=lambda: remove(num.get())).pack() def remove(num): child_window.destroy() for etagereUI in self.etageresUI: if etagereUI.etagere.num_etagere == int(num): print("find") self.etagere_frame.delete(etagereUI.canvasID) self.etageresUI.remove(etagereUI) self.etageres.remove_etagere(int(num)) class EtagereUI(LabelFrame): def __init__(self, etagere, etageresUI): LabelFrame.__init__(self, etageresUI.etagere_frame, text=etagere) self.etagere = etagere self.etageresUI = etageresUI for hauteur in range(self.etagere.hauteur): for largeur in range(self.etagere.largeur): isset = False for bouteille in self.etagere: if (largeur == bouteille.pos_largeur and hauteur == bouteille.pos_hauteur): BouteilleUI(bouteille, self) isset = True break if not isset: Cassier_videUI(largeur, hauteur, self) if(len(self.etageresUI.etageresUI)==0): self.canvasID=etageresUI.etagere_frame.create_window(0, 0,window=self,anchor="nw",tag="ALL") else: bbox=self.etageresUI.etagere_frame.bbox("ALL") print(bbox) self.canvasID=etageresUI.etagere_frame.create_window(0,bbox[3]+20,anchor="nw",window=self,tag="ALL") self.etageresUI.etagere_frame.update() def click_remove_bouteille(self, bouteilleUI): self.etagere.remove_bouteille( bouteilleUI.bouteille.pos_largeur, bouteilleUI.bouteille.pos_hauteur) bouteilleUI.destroy() Cassier_videUI(bouteilleUI.bouteille.pos_largeur, bouteilleUI.bouteille.pos_hauteur, self) self["text"] = self.etagere def click_add_bouteille(self, cassiervide): child_window = Toplevel(self.etageresUI) Label(child_window, text="select color").pack() couleur = StringVar() couleur.set("rouge") OptionMenu(child_window, couleur, * self.etageresUI.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() print(cassiervide.pos_largeur) print(cassiervide.pos_hauteur) newbouteille = self.etagere.add_bouteille( cassiervide.pos_largeur, cassiervide.pos_hauteur, couleur, appelation, millesime) cassiervide.destroy() BouteilleUI(newbouteille, self) self["text"] = self.etagere class Cassier_videUI(Button): def __init__(self, pos_largeur, pos_hauteur, etagereUI): Button.__init__(self, etagereUI, text="cassier vide", command=lambda: self.etagereUI.click_add_bouteille(self)) self.pos_largeur = pos_largeur self.pos_hauteur = pos_hauteur self.etagereUI = etagereUI self.grid(row=self.pos_hauteur, column=self.pos_largeur) class BouteilleUI(Button): def __init__(self, bouteille, etagereUI): self.bouteille = bouteille self.etagereUI = etagereUI Button.__init__(self, etagereUI, text=self.bouteille, command=lambda: self.etagereUI.click_remove_bouteille(self)) self["bg"] = self.etagereUI.etageresUI.etageres.couleur[self.bouteille.couleur] self.grid(row=self.bouteille.pos_hauteur, column=self.bouteille.pos_largeur) #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) EtageresUI(Etageres.load_etageres("cave")).mainloop()