'''
ARGOMENTI:

    - Frame
        All'interno della finestra, oltre ai "widget", si possono 
        disporre dei "frame" (riquadro/cornice) che permettono 
        di raggruppare un certo numero di "widget" all'interno di esso. 

        Riposizionando il "frame" in un altro punto della finestra 
        si spostano assieme ad esso anche tutti i "widget" contenuti.

        Il "frame" e' anche utile per creare elementi decorativi:
        separatori, riquadri tridimensionali, etc. etc.

        Ogni elemento di una applicazione grafica ha un oggetto 
        "parent" (genitore) ed eventualmente uno o piu' oggetti 
        "child" (figlio). Un oggetto "Frame" di base ha come "parent" 
        la finestra stessa

    - Grid
        Permette di posizionare i "widget" all'interno di una cella di 
        una griglia creata all'interno del "parent".
    

    - Padding
        Durante la definizone delle celle e' possibile regolarne i margini sia 
            esternamente (padx=Npixel, pady=Npixel) che
            internamente (ipadx=Npixel, ipady=Npixel)

         Il margine lasciato dal padding esterno ha il colore di sfondo dell'elemento "parent"



Nell'esempio verra' costruito un layout del seguente tipo:

         --------------------------
        | Riga 0 | Riga 0 | Riga 0 |
        | Col. 0 | Col. 1 | Col. 2 |
        | Bianco | Nero   | Verde  |
        |------------------        |
        | Riga 1 | Riga 1 |        |
        | Col. 0 | Col. 1 | Riga 0 |
        | Rosso  | Blu    |   >    |
        |------------------ span 3 |
        | Riga 2          |        |
        | Col. 0 > span 2 |        |
        | Rosa            |        |
         --------------------------





    
'''
from tkinter import *

# Visualizza la versione di Python
# Ho avuto problemi con le diverse versioni
import sys
print(sys.version)


fin = Tk()
fin.geometry("600x600+300+50")
fin.title("Applicazione")


#------------------------------------------------- widget
lq=160 # lato del quadrato
fra1=Frame(fin, bg="white", width=lq, height=lq)
fra2=Frame(fin, bg="black", width=lq, height=lq)
fra3=Frame(fin, bg="red", width=lq, height=lq)
fra4=Frame(fin, bg="blue", width=lq, height=lq)
fra5=Frame(fin, bg="pink", width=2*lq, height=lq)  # notare larghezza "doppia"
fra6=Frame(fin, bg="green", width=lq, height=3*lq) # notare altezza "tripla"

p=10 #padding
# "impacchetto" i frame in una griglia
# notare che il padding dato alla cella (0,0) si "ripercuote" sulle celle "collegate"
# se si eliminano i "pad" non si avranno margini tra i frame
fra1.grid(row=0, column=0, padx=p, pady=p)
fra2.grid(row=0, column=1)
fra3.grid(row=1, column=0)
fra4.grid(row=1, column=1)
fra5.grid(row=2, column=0, columnspan=2)
fra6.grid(row=0, column=2, rowspan=3, ipadx=p, ipady=p)


# Cella (0;0) ----------------------------------------
# permette alla cella di non "collassare" e far vedere lo sfondo
fra1.grid_propagate(False)  
btn1= Button(fra1, text="Pulsante 1")
btn1.grid()     # .grid() in sostituzione del pack()  
btn2 = Button(fra1, text="Pulsante 2 ")
btn2.grid() 
btn3 = Button(fra1, text="Pulsante 2 ")
btn3.grid() 

# Cella (0;1) ----------------------------------------
fra2.grid_propagate(False)  
lbl1 = Label(fra2, text="Etichetta 1")
lbl1.grid() 
lbl2 = Label(fra2, text="Etichetta 2")
lbl2.grid() 

# Cella (0;1) ----------------------------------------
# fra2.grid_propagate(False) 
# se facciamo "collassare" la cella l'elemento viene "centrato"  
ent = Entry(fra3,text="Entry")                   
ent.insert(0,"Casella testo")
ent.grid()                  

# Cella (1;1) ----------------------------------------
fra4.grid_propagate(False)  
btn4= Button(fra4, text="Pulsante 4")
# volendo centrare il pulsante all'interno del grid
# bisogna usare le seguenti istruzioni
fra4.grid_rowconfigure(0,weight=2)
fra4.grid_columnconfigure(0,weight=2)
btn4.grid(row=0, column=0)

 # Cella (0;3 -> rowspan=3) --------------------------
fra6.grid_propagate(False)  
# per centrare 2 o piu' oggetti all'interno di un frame 
# (sia H che V), dopo aver girovagato inutilmente su internet,
# ho pensato a questa soluzione:
#       1) creare un nuovo frame e inserirlo nel frame "parent"
#       2) inserire i "widget" nel nuovo frame
fra6.grid_rowconfigure(0,weight=2)
fra6.grid_columnconfigure(0,weight=2)
nuovoFrame=Frame(fra6)
nuovoFrame.grid(row=0, column=0)
lbl3 = Label(nuovoFrame, text="Etichetta 3")
lbl4 = Label(nuovoFrame, text="Etichetta 4")
btn5= Button(nuovoFrame, text="Pulsante 5")
lbl3.pack()
lbl4.pack()
btn5.pack()
#--------------------------------------------------------

  
fin.mainloop()









