2018-02-11 18:20:16 +00:00
import json
2018-02-11 19:50:12 +00:00
from tkinter import Scrollbar , Label , LabelFrame , Entry , Button , OptionMenu , StringVar , Canvas , Toplevel , N , S , VERTICAL , Tk , Frame
2018-02-05 21:24:27 +00:00
2018-02-03 18:22:49 +00:00
class Etageres ( object ) :
2018-02-03 16:58:40 +00:00
def __init__ ( self ) :
2018-02-05 20:16:16 +00:00
self . etageres = [ ]
self . nbetagere = 0
2018-02-11 18:20:16 +00:00
self . couleur = { " rouge " : " red " , " blanc " : " white " ,
" rose " : " pink " , " champagne " : " yellow " }
2018-02-05 20:52:28 +00:00
@classmethod
2018-02-11 18:20:16 +00:00
def load_etageres ( cls , file ) :
2018-02-10 20:45:11 +00:00
try :
with open ( file , ' rb ' ) as json_data :
2018-02-11 18:20:16 +00:00
data = json . load ( json_data )
2018-02-10 20:45:11 +00:00
except FileNotFoundError :
2018-02-11 18:20:16 +00:00
print ( " no file to load " )
2018-02-10 20:45:11 +00:00
return Etageres ( )
2018-02-11 18:20:16 +00:00
loadobj = Etageres ( )
for etagere in data [ " etageres " ] :
print ( " etagere: " )
print ( etagere )
loadobj . add_etagere ( etagere [ " largeur " ] , etagere [ " hauteur " ] )
2018-02-10 20:45:11 +00:00
for bouteille in etagere [ " bouteilles " ] :
2018-02-11 18:20:16 +00:00
loadobj . etageres [ loadobj . nbetagere - 1 ] . add_bouteille (
bouteille [ " pos_largeur " ] , bouteille [ " pos_hauteur " ] , bouteille [ " couleur " ] ,
bouteille [ " millesime " ] , bouteille [ " appelation " ] )
return loadobj
2018-02-05 20:16:16 +00:00
def add_etagere ( self , largeur , hauteur ) :
self . nbetagere + = 1
2018-02-11 18:20:16 +00:00
newetagere = Etagere ( largeur , hauteur , self )
2018-02-11 12:00:18 +00:00
self . etageres . append ( newetagere )
return newetagere
2018-02-11 18:20:16 +00:00
2018-02-05 20:16:16 +00:00
def nbbouteille ( self ) :
i = 0
2018-02-05 19:58:39 +00:00
for etagere in self . etageres :
2018-02-11 18:20:16 +00:00
i + = len ( etagere . bouteilles )
2018-02-05 20:16:16 +00:00
2018-02-05 19:58:39 +00:00
return i
2018-02-05 20:16:16 +00:00
def nbbouteillecouleur ( self , couleur ) :
2018-02-05 19:58:39 +00:00
i = 0
for etagere in self . etageres :
2018-02-05 20:16:16 +00:00
for bouteille in etagere :
if bouteille . couleur == couleur :
i + = 1
2018-02-05 19:58:39 +00:00
return i
2018-02-05 20:16:16 +00:00
2018-02-11 18:20:16 +00:00
def remove_etagere ( self , num_etagere ) :
2018-02-11 12:00:18 +00:00
for etagere in self . etageres :
2018-02-11 18:20:16 +00:00
if etagere . num_etagere == num_etagere :
2018-02-11 12:00:18 +00:00
self . etageres . remove ( etagere )
2018-02-12 19:15:58 +00:00
2018-02-11 12:00:18 +00:00
return 0
return " pas d ' étagere a ce numéros "
2018-02-05 20:16:16 +00:00
2018-02-11 18:20:16 +00:00
def save_etageres ( self , file ) :
2018-02-10 20:45:11 +00:00
with open ( file , ' w ' ) as output :
2018-02-11 18:20:16 +00:00
data = { " etageres " : [ ] }
2018-02-10 20:45:11 +00:00
for etagere in self . etageres :
data [ " etageres " ] . append ( etagere . save ( ) )
print ( data )
2018-02-11 18:20:16 +00:00
json . dump ( data , output , indent = 4 )
print ( " save ok " )
2018-02-05 20:16:16 +00:00
2018-02-05 19:58:39 +00:00
def __iter__ ( self ) :
return iter ( self . etageres )
2018-02-03 16:58:40 +00:00
2018-02-03 18:22:49 +00:00
class Etagere ( object ) :
2018-02-05 20:16:16 +00:00
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 ) :
2018-02-11 14:56:51 +00:00
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 "
2018-02-05 19:58:39 +00:00
for bouteille in self . bouteilles :
2018-02-05 20:52:28 +00:00
if ( pos_largeur == bouteille . pos_largeur and pos_hauteur == bouteille . pos_hauteur ) :
return " une bouteille existe déja a cette emplacement "
2018-02-11 18:20:16 +00:00
newbouteille = Bouteille (
pos_largeur , pos_hauteur , couleur , appelation , millesime , self )
2018-02-11 12:00:18 +00:00
self . bouteilles . append ( newbouteille )
return newbouteille
2018-02-11 18:20:16 +00:00
2018-02-05 20:16:16 +00:00
def remove_bouteille ( self , pos_largeur , pos_hauteur ) :
i = 0
2018-02-05 19:58:39 +00:00
for bouteille in self . bouteilles :
2018-02-05 20:16:16 +00:00
if ( pos_largeur == bouteille . pos_largeur and pos_hauteur == bouteille . pos_hauteur ) :
2018-02-05 19:58:39 +00:00
self . bouteilles . remove ( bouteille )
2018-02-11 18:20:16 +00:00
return " bouteille suprimé "
2018-02-05 19:58:39 +00:00
else :
i + = 1
2018-02-11 18:20:16 +00:00
return " aucune bouteille troué a cette emplacement "
2018-02-11 12:00:18 +00:00
def save ( self ) :
2018-02-11 18:20:16 +00:00
data = { " largeur " : self . largeur ,
" hauteur " : self . hauteur , " bouteilles " : [ ] }
2018-02-11 12:00:18 +00:00
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 )
2018-02-11 18:20:16 +00:00
2018-02-11 12:00:18 +00:00
class Bouteille ( object ) :
def __init__ ( self , pos_largeur , pos_hauteur , couleur , appelation , millesime , etagere ) :
self . pos_largeur = pos_largeur
self . pos_hauteur = pos_hauteur
2018-02-11 18:20:16 +00:00
2018-02-11 12:00:18 +00:00
self . couleur = couleur
self . millesime = millesime
self . appelation = appelation
self . etagere = etagere
def save ( self ) :
2018-02-11 18:20:16 +00:00
data = { " pos_largeur " : self . pos_largeur , " pos_hauteur " : self . pos_hauteur ,
" couleur " : self . couleur , " millesime " : self . millesime , " appelation " : self . appelation }
2018-02-11 12:00:18 +00:00
return data
2018-02-11 18:20:16 +00:00
2018-02-11 12:00:18 +00:00
def __repr__ ( self ) :
2018-02-12 19:15:58 +00:00
return " {} , {} " . format ( self . appelation , self . millesime )
2018-02-10 16:26:12 +00:00
2018-02-11 12:00:18 +00:00
2018-02-11 18:20:16 +00:00
class EtageresUI ( Tk ) :
def __init__ ( self , etageres ) :
Tk . __init__ ( self )
self . etageres = etageres
self . title ( string = " cave a vin " )
self . etageresUI = [ ]
2018-02-11 19:50:12 +00:00
self . mainframe = Frame ( self )
vscrollbar = Scrollbar ( self . mainframe , orient = VERTICAL )
2018-02-12 19:15:58 +00:00
self . etagere_frame = Canvas ( self . mainframe , yscrollcommand = vscrollbar . set , width = 1000 , height = 1000 )
2018-02-11 19:50:12 +00:00
for etagere in self . etageres :
newetagere = EtagereUI ( etagere , self )
self . etageresUI . append ( newetagere )
2018-02-12 19:15:58 +00:00
self . etagere_frame . config ( scrollregion = self . etagere_frame . bbox ( " all " ) )
2018-02-11 15:14:17 +00:00
2018-02-11 18:20:16 +00:00
vscrollbar . grid ( column = 2 , row = 1 , sticky = N + S )
vscrollbar . config ( command = self . etagere_frame . yview )
2018-02-11 19:50:12 +00:00
framecontrol = LabelFrame ( self . mainframe , text = " command pannel " )
framecontrol . grid ( column = 3 , row = 1 )
2018-02-11 18:20:16 +00:00
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 )
2018-02-11 19:50:12 +00:00
self . mainframe . grid ( )
2018-02-11 12:00:18 +00:00
def click_add_etagere ( self ) :
2018-02-11 18:20:16 +00:00
child_window = Toplevel ( self )
Label ( child_window , text = " select largeur " ) . pack ( )
largeur = StringVar ( )
Entry ( child_window , textvariable = largeur ) . pack ( )
2018-02-11 12:00:18 +00:00
2018-02-11 18:20:16 +00:00
Label ( child_window , text = " hauteur " ) . pack ( )
hauteur = StringVar ( )
Entry ( child_window , textvariable = hauteur ) . pack ( )
2018-02-11 12:00:18 +00:00
2018-02-11 18:20:16 +00:00
Button ( child_window , text = " OK " , command = lambda : add (
largeur . get ( ) , hauteur . get ( ) ) ) . pack ( )
def add ( largeur , hauteur ) :
2018-02-11 12:00:18 +00:00
child_window . destroy ( )
2018-02-11 18:20:16 +00:00
newetagere = self . etageres . add_etagere ( int ( largeur ) , int ( hauteur ) )
self . etageresUI . append ( EtagereUI ( newetagere , self ) )
2018-02-12 19:15:58 +00:00
self . etagere_frame . config ( scrollregion = self . etagere_frame . bbox ( " all " ) )
2018-02-11 12:00:18 +00:00
def click_remove_etagere ( self ) :
2018-02-11 18:20:16 +00:00
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 ( )
2018-02-11 12:00:18 +00:00
def remove ( num ) :
child_window . destroy ( )
for etagereUI in self . etageresUI :
2018-02-11 18:20:16 +00:00
if etagereUI . etagere . num_etagere == int ( num ) :
print ( " find " )
2018-02-12 19:15:58 +00:00
self . etagere_frame . delete ( etagereUI . canvasID )
self . etageresUI . remove ( etagereUI )
2018-02-11 12:00:18 +00:00
self . etageres . remove_etagere ( int ( num ) )
2018-02-11 14:56:51 +00:00
class EtagereUI ( LabelFrame ) :
2018-02-11 18:20:16 +00:00
def __init__ ( self , etagere , etageresUI ) :
LabelFrame . __init__ ( self , etageresUI . etagere_frame , text = etagere )
self . etagere = etagere
self . etageresUI = etageresUI
2018-02-11 12:00:18 +00:00
for hauteur in range ( self . etagere . hauteur ) :
for largeur in range ( self . etagere . largeur ) :
2018-02-10 16:26:12 +00:00
isset = False
2018-02-11 12:00:18 +00:00
for bouteille in self . etagere :
2018-02-10 16:26:12 +00:00
if ( largeur == bouteille . pos_largeur and hauteur == bouteille . pos_hauteur ) :
2018-02-11 18:20:16 +00:00
BouteilleUI ( bouteille , self )
2018-02-10 16:26:12 +00:00
isset = True
break
2018-02-11 18:20:16 +00:00
if not isset :
Cassier_videUI ( largeur , hauteur , self )
2018-02-12 19:15:58 +00:00
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 ( )
2018-02-11 18:20:16 +00:00
def click_remove_bouteille ( self , bouteilleUI ) :
self . etagere . remove_bouteille (
bouteilleUI . bouteille . pos_largeur , bouteilleUI . bouteille . pos_hauteur )
2018-02-11 14:56:51 +00:00
bouteilleUI . destroy ( )
2018-02-11 18:20:16 +00:00
Cassier_videUI ( bouteilleUI . bouteille . pos_largeur ,
bouteilleUI . bouteille . pos_hauteur , self )
self [ " text " ] = self . etagere
2018-02-12 19:15:58 +00:00
2018-02-11 18:20:16 +00:00
def click_add_bouteille ( self , cassiervide ) :
child_window = Toplevel ( self . etageresUI )
Label ( child_window , text = " select color " ) . pack ( )
couleur = StringVar ( )
2018-02-10 18:08:53 +00:00
couleur . set ( " rouge " )
2018-02-11 18:20:16 +00:00
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 ) :
2018-02-10 18:08:53 +00:00
child_window . destroy ( )
2018-02-11 14:56:51 +00:00
print ( cassiervide . pos_largeur )
print ( cassiervide . pos_hauteur )
2018-02-11 18:20:16 +00:00
newbouteille = self . etagere . add_bouteille (
cassiervide . pos_largeur , cassiervide . pos_hauteur , couleur , appelation , millesime )
2018-02-11 14:56:51 +00:00
cassiervide . destroy ( )
2018-02-11 18:20:16 +00:00
BouteilleUI ( newbouteille , self )
self [ " text " ] = self . etagere
2018-02-10 16:26:12 +00:00
2018-02-11 14:56:51 +00:00
class Cassier_videUI ( Button ) :
2018-02-11 18:20:16 +00:00
def __init__ ( self , pos_largeur , pos_hauteur , etagereUI ) :
Button . __init__ ( self , etagereUI , text = " cassier vide " ,
command = lambda : self . etagereUI . click_add_bouteille ( self ) )
2018-02-10 16:26:12 +00:00
self . pos_largeur = pos_largeur
self . pos_hauteur = pos_hauteur
2018-02-11 12:00:18 +00:00
self . etagereUI = etagereUI
2018-02-11 18:20:16 +00:00
self . grid ( row = self . pos_hauteur , column = self . pos_largeur )
2018-02-11 14:56:51 +00:00
class BouteilleUI ( Button ) :
2018-02-11 18:20:16 +00:00
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 )
2018-02-05 18:37:13 +00:00
2018-02-11 14:56:51 +00:00
#new = Etageres.load_etageres("cave")
2018-02-10 20:45:11 +00:00
#new =Etageres()
#new.add_etagere(10, 3)
2018-02-11 18:20:16 +00:00
# new.add_etagere(4,4)
2018-02-10 20:45:11 +00:00
#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))
2018-02-11 18:20:16 +00:00
# print(new.etageres[0].bouteilles)
2018-02-10 20:45:11 +00:00
#print("vos etagére contiennes {} bouteille".format(new.nbbouteille()))
2018-02-11 18:20:16 +00:00
# print("vos etagére contiennes {} bouteille de rouge".format(
# new.nbbouteillecouleur("rouge")))
# print(new.couleur)
2018-02-11 12:00:18 +00:00
2018-02-11 18:20:16 +00:00
EtageresUI ( Etageres . load_etageres ( " cave " ) ) . mainloop ( )