'''
ARGOMENTI: 
---------------------------------------------------------------------

	- Binding parametrizzato
			Un interessante modo per parametrizzare il binding l'ho scovato in
			rete e consiste nel costruire una funzione "lambda" in questo modo:

				lambda fEVENTO:fGESTIONE(fEVENTO, PARAMETRO [, PARAMETRO]...))


			# NOTA: 	
				Per non complicare l'esempio, i parametri delle funzioni 
				"lambda" da inviare alla funzione "gEvParam" sono stati gestiti 
				come stringhe "singole": si sarebbe potuto realizzare il tutto 
				utilizzando variabili/liste/dizionari. 



	- funzioni con parametri ozionali
			Assegnando un valore di default ad un parametro di una funzione 
			si rende quel parametro opzionale.
			La funzione assume quel valore se, al momento della chiamata,
			non viene fornito quel particolare parametro.



'''
from tkinter import *

# -------------------------------------------------------------------
# funzione che gestisce ogni singolo attributo
# -------------------------------------------------------------------
def gestioneAttributo(attibutoEVENT, strATTRIBUTO):
	msg=""
	try: V = str(attibutoEVENT)
	except: PASS
	if V != "??": # se un particolare evento non appartiene al widget resitutisce "??"
		msg += strATTRIBUTO + ":\t\t" + V + "\n"
	return msg

# -------------------------------------------------------------------
# funzione che visualizza tutti gli attributi dell'evento intercettato
# -------------------------------------------------------------------
def visualizzaAttributi(event, PARAMETRO):
	msg = PARAMETRO
	msg += gestioneAttributo(event.x, "x")
	msg += gestioneAttributo(event.y, "y")
	msg += gestioneAttributo(event.x_root, "x_root")
	msg += gestioneAttributo(event.y_root, "y_root")
	msg += gestioneAttributo(event.num, "num")
	msg += gestioneAttributo(event.char, "char")
	msg += gestioneAttributo(event.keysym, "keysym")
	msg += gestioneAttributo(event.keycode, "keycode")
	msg += gestioneAttributo(event.width, "width")
	msg += gestioneAttributo(event.height, "height")
	msg += gestioneAttributo(event.widget, "widget")
	msg += gestioneAttributo(event.delta, "delta")
	msg += gestioneAttributo(event.state, "state")
	msg += gestioneAttributo(event.serial, "serial")
	msg += gestioneAttributo(event.time, "time")
	msg += "\n\n\n"
	
	finMessaggi.insert(0.0,msg) 

# -----------------------------------------------------------------------------------------
# funzione richiamata dalla funzione "lambda" per gestire il "bind"
#	- strOGGETTO :  stringa contenente il nome dell'oggetto 
#	- strEVENTO  :  stringa con la descrizione dell'evento
#	- parVALORE  :  valore che restituisce il widget o  la variabile associata (OPZIONALE)
# -----------------------------------------------------------------------------------------
def gEvParam(event,strOGGETTO, strEVENTO, parVALORE="N/A"):
	msg = "**********************************************************\n"
	msg = msg + "OGGETTO.....: " + strOGGETTO + "\n"
	msg = msg + "EVENTO......: " + strEVENTO + "\n"
	msg = msg + "VALORE......: " + str(parVALORE) + "\n"  # Default "N/A"
	msg = msg + "-----------------------\n"
	msg = msg + "Attributi ricognizzati:\n"
	msg = msg + "-----------------------\n"
	visualizzaAttributi(event, msg)




# definizione della finestra
fin = Tk()
fin.title("Applicazione")
fin.resizable(width=False, height=False)

messaggio= "Su questo widget e' stato 'intercettato' solo l'evento <Enter>"


# -------------------------------------------------------------
# labelframe contenente vari widget
# sui quali e' possibile intercettare gli eventi
# -------------------------------------------------------------

contenitore1=LabelFrame(text="Intercettazione eventi")

# area testo
txtTEST = Text(contenitore1, height=6, width=60)   
txtTEST.insert(END,"TextArea")
txtTEST.pack(pady=(10, 0)) # padding verticale 10:nord, 0:sud


# spinbox - Testato valori stringa
spinTEST = Spinbox(contenitore1, values=("a","b","c","d","e","f"))
spinTEST.pack(side="left")

# check button: per utilizzare i metodi di varCheck bisogna dichiararla IntVar()
varCheck1= IntVar()
varCheck2= IntVar()
chkTEST1 = Checkbutton(contenitore1, text="Uno",variable=varCheck1)
chkTEST2 = Checkbutton(contenitore1, text="Due",variable=varCheck2)
chkTEST1.pack(side="left")
chkTEST2.pack(side="left")

# scale 
scaleTEST = Scale(contenitore1, from_=0, to=100, orient=HORIZONTAL)
scaleTEST.pack(side="left")

# radio button - Impacchettati in una lista per testare la "cosa"
varRadio=StringVar()
varRadio.set("2") # default
rbtTEST=[]
rbtTEST.append(Radiobutton(contenitore1, text="A", variable=varRadio, value="A"))
rbtTEST.append(Radiobutton(contenitore1, text="B", variable=varRadio, value="B"))
rbtTEST.append(Radiobutton(contenitore1, text="C", variable=varRadio, value="C"))
rbtTEST[0].pack(side="left")   
rbtTEST[1].pack(side="left")
rbtTEST[2].pack(side="left")

#pulsante
btnTEST = Button(contenitore1, text="Pulsante")
btnTEST.pack(side="left")  

contenitore1.pack(fill="x")         

# -------------------------------------------------------------
# labelframe contenente un' area testo per i messaggi,
# una scrollbar associata ed un pulsante per ripulire l'area
# -------------------------------------------------------------
contenitore2=LabelFrame(text="Valori degli attributi")
# area testo
finMessaggi = Text(contenitore2,bg="white")   
finMessaggi.grid(row=0, column=0, pady=(10, 0), sticky='nsew')
# scrollbar associata all'area testo
scrollb = Scrollbar(contenitore2, command=finMessaggi.yview)
scrollb.grid(row=0, column=1, sticky='nsew')
finMessaggi['yscrollcommand'] = scrollb.set
contenitore2.pack(pady=(20, 0)) # padding verticale 20:nord, 0:sud
# pulsanti ripulisci area testo
btnPULISCI = Button(text="Ripulisci", command=lambda:(finMessaggi.delete("1.0", END))).pack()  
# -------------------------------------------------------------


# "bind" Checkbutton 1
chkTEST1.bind("<Button-1>",  		lambda fEv:gEvParam(fEv,"Check Uno", "Click su pulsante SX", varCheck1.get()))
chkTEST1.bind("<Button-2>",  		lambda fEv:gEvParam(fEv,"Check Uno", "Click su pulsante CE", varCheck1.get()))
chkTEST1.bind("<Button-3>",  		lambda fEv:gEvParam(fEv,"Check Uno", "Click su pulsante DX", varCheck1.get()))
chkTEST1.bind("<Button-4>",  		lambda fEv:gEvParam(fEv,"Check Uno", "Spostato rotellina SU", varCheck1.get()))
chkTEST1.bind("<Button-5>",  		lambda fEv:gEvParam(fEv,"Check Uno", "Spostato rotellina GIU", varCheck1.get()))
chkTEST1.bind("<Double-1>",  		lambda fEv:gEvParam(fEv,"Check Uno", "DoppioClick su pulsante SX", varCheck1.get()))
chkTEST1.bind("<Double-2>",  		lambda fEv:gEvParam(fEv,"Check Uno", "DoppioClick su pulsante CE", varCheck1.get()))
chkTEST1.bind("<Double-3>",  		lambda fEv:gEvParam(fEv,"Check Uno", "DoppioClick su pulsante DX", varCheck1.get()))
chkTEST1.bind("<FocusIn>",   		lambda fEv:gEvParam(fEv,"Check Uno", "Il widget è stato <Messo a fuoco>", varCheck1.get()))
chkTEST1.bind("<FocusOut>",  		lambda fEv:gEvParam(fEv,"Check Uno", "Il widget ha perso la <Messa a fuoco>", varCheck1.get()))
chkTEST1.bind("<B1-Motion>", 		lambda fEv:gEvParam(fEv,"Check Uno", "Spostamento sul widget con PSX premuto", varCheck1.get()))
chkTEST1.bind("<B2-Motion>", 		lambda fEv:gEvParam(fEv,"Check Uno", "Spostamento sul widget con PCE premuto", varCheck1.get()))
chkTEST1.bind("<B3-Motion>", 		lambda fEv:gEvParam(fEv,"Check Uno", "Spostamento sul widget con PDX premuto", varCheck1.get()))
chkTEST1.bind("<ButtonRelease-1>", 	lambda fEv:gEvParam(fEv,"Check Uno", "Rilascio Pulsante SX", varCheck1.get()))
chkTEST1.bind("<ButtonRelease-2>", 	lambda fEv:gEvParam(fEv,"Check Uno", "Rilascio Pulsante CE", varCheck1.get()))
chkTEST1.bind("<ButtonRelease-3>", 	lambda fEv:gEvParam(fEv,"Check Uno", "Rilascio Pulsante DX", varCheck1.get()))
chkTEST1.bind("<Enter>", 			lambda fEv:gEvParam(fEv,"Check Uno", "Il puntatore e' ENTRATO nel widget", varCheck1.get()))
chkTEST1.bind("<Leave>", 			lambda fEv:gEvParam(fEv,"Check Uno", "Il puntatore e' USCITO dal widget", varCheck1.get()))
chkTEST1.bind("<Key>", 				lambda fEv:gEvParam(fEv,"Check Uno", "Pressione di un tasto", varCheck1.get()))

# "bind" Checkbutton 2
chkTEST2.bind("<Enter>", 			lambda fEv:gEvParam(fEv,"Check Due", messaggio, varCheck2.get()))

# "bind" Radiobutton 1
rbtTEST[0].bind("<Button-1>",  		lambda fEv:gEvParam(fEv,"Radio A", "Click su pulsante SX", varRadio.get()))
rbtTEST[0].bind("<Button-2>",  		lambda fEv:gEvParam(fEv,"Radio A", "Click su pulsante CE", varRadio.get()))
rbtTEST[0].bind("<Button-3>",  		lambda fEv:gEvParam(fEv,"Radio A", "Click su pulsante DX", varRadio.get()))
rbtTEST[0].bind("<Button-4>",  		lambda fEv:gEvParam(fEv,"Radio A", "Spostato rotellina SU", varRadio.get()))
rbtTEST[0].bind("<Button-5>",  		lambda fEv:gEvParam(fEv,"Radio A", "Spostato rotellina GIU", varRadio.get()))
rbtTEST[0].bind("<Double-1>",  		lambda fEv:gEvParam(fEv,"Radio A", "DoppioClick su pulsante SX", varRadio.get()))
rbtTEST[0].bind("<Double-2>",  		lambda fEv:gEvParam(fEv,"Radio A", "DoppioClick su pulsante CE", varRadio.get()))
rbtTEST[0].bind("<Double-3>",  		lambda fEv:gEvParam(fEv,"Radio A", "DoppioClick su pulsante DX", varRadio.get()))
rbtTEST[0].bind("<FocusIn>",   		lambda fEv:gEvParam(fEv,"Radio A", "Il widget è stato <Messo a fuoco>", varRadio.get()))
rbtTEST[0].bind("<FocusOut>",  		lambda fEv:gEvParam(fEv,"Radio A", "Il widget ha perso la <Messa a fuoco>", varRadio.get()))
rbtTEST[0].bind("<B1-Motion>", 		lambda fEv:gEvParam(fEv,"Radio A", "Spostamento sul widget con PSX premuto", varRadio.get()))
rbtTEST[0].bind("<B2-Motion>", 		lambda fEv:gEvParam(fEv,"Radio A", "Spostamento sul widget con PCE premuto", varRadio.get()))
rbtTEST[0].bind("<B3-Motion>", 		lambda fEv:gEvParam(fEv,"Radio A", "Spostamento sul widget con PDX premuto", varRadio.get()))
rbtTEST[0].bind("<ButtonRelease-1>",lambda fEv:gEvParam(fEv,"Radio A", "Rilascio Pulsante SX", varRadio.get()))
rbtTEST[0].bind("<ButtonRelease-2>",lambda fEv:gEvParam(fEv,"Radio A", "Rilascio Pulsante CE", varRadio.get()))
rbtTEST[0].bind("<ButtonRelease-3>",lambda fEv:gEvParam(fEv,"Radio A", "Rilascio Pulsante DX", varRadio.get()))
rbtTEST[0].bind("<Enter>", 			lambda fEv:gEvParam(fEv,"Radio A", "Il puntatore e' ENTRATO nel widget", varRadio.get()))
rbtTEST[0].bind("<Leave>", 			lambda fEv:gEvParam(fEv,"Radio A", "Il puntatore e' USCITO dal widget", varRadio.get()))
rbtTEST[0].bind("<Key>", 			lambda fEv:gEvParam(fEv,"Radio A", "Pressione di un tasto", varRadio.get()))

# "bind" Radiobutton 2
rbtTEST[1].bind("<Enter>", 			lambda fEv:gEvParam(fEv,"Radio B", messaggio, varRadio.get()))

# "bind" Radiobutton3
rbtTEST[2].bind("<Enter>", 			lambda fEv:gEvParam(fEv,"Radio C", messaggio, varRadio.get()))

# "bind" Button
btnTEST.bind("<Button-1>",  		lambda fEv:gEvParam(fEv,"Pulsante", "Click su pulsante SX"))
btnTEST.bind("<Button-2>",  		lambda fEv:gEvParam(fEv,"Pulsante", "Click su pulsante CE"))
btnTEST.bind("<Button-3>",  		lambda fEv:gEvParam(fEv,"Pulsante", "Click su pulsante DX"))
btnTEST.bind("<Button-4>",  		lambda fEv:gEvParam(fEv,"Pulsante", "Spostato rotellina SU"))
btnTEST.bind("<Button-5>",  		lambda fEv:gEvParam(fEv,"Pulsante", "Spostato rotellina GIU"))
btnTEST.bind("<Double-1>",  		lambda fEv:gEvParam(fEv,"Pulsante", "DoppioClick su pulsante SX"))
btnTEST.bind("<Double-2>",  		lambda fEv:gEvParam(fEv,"Pulsante", "DoppioClick su pulsante CE"))
btnTEST.bind("<Double-3>",  		lambda fEv:gEvParam(fEv,"Pulsante", "DoppioClick su pulsante DX"))
btnTEST.bind("<FocusIn>",   		lambda fEv:gEvParam(fEv,"Pulsante", "Il widget è stato <Messo a fuoco>"))
btnTEST.bind("<FocusOut>",  		lambda fEv:gEvParam(fEv,"Pulsante", "Il widget ha perso la <Messa a fuoco>"))
btnTEST.bind("<B1-Motion>", 		lambda fEv:gEvParam(fEv,"Pulsante", "Spostamento sul widget con PSX premuto"))
btnTEST.bind("<B2-Motion>", 		lambda fEv:gEvParam(fEv,"Pulsante", "Spostamento sul widget con PCE premuto"))
btnTEST.bind("<B3-Motion>", 		lambda fEv:gEvParam(fEv,"Pulsante", "Spostamento sul widget con PDX premuto"))
btnTEST.bind("<ButtonRelease-1>", 	lambda fEv:gEvParam(fEv,"Pulsante", "Rilascio Pulsante SX"))
btnTEST.bind("<ButtonRelease-2>", 	lambda fEv:gEvParam(fEv,"Pulsante", "Rilascio Pulsante CE"))
btnTEST.bind("<ButtonRelease-3>", 	lambda fEv:gEvParam(fEv,"Pulsante", "Rilascio Pulsante DX"))
btnTEST.bind("<Enter>", 			lambda fEv:gEvParam(fEv,"Pulsante", "Il puntatore e' ENTRATO nel widget"))
btnTEST.bind("<Leave>", 			lambda fEv:gEvParam(fEv,"Pulsante", "Il puntatore e' USCITO dal widget"))
btnTEST.bind("<Key>", 				lambda fEv:gEvParam(fEv,"Pulsante", "Pressione di un tasto"))

# "bind" Text
txtTEST.bind("<Button-1>",  		lambda fEv:gEvParam(fEv,"Area testo", "Click su pulsante SX"))
txtTEST.bind("<Button-2>",  		lambda fEv:gEvParam(fEv,"Area testo", "Click su pulsante CE"))
txtTEST.bind("<Button-3>",  		lambda fEv:gEvParam(fEv,"Area testo", "Click su pulsante DX"))
txtTEST.bind("<Button-4>",  		lambda fEv:gEvParam(fEv,"Area testo", "Spostato rotellina SU"))
txtTEST.bind("<Button-5>",  		lambda fEv:gEvParam(fEv,"Area testo", "Spostato rotellina GIU"))
txtTEST.bind("<Double-1>",  		lambda fEv:gEvParam(fEv,"Area testo", "DoppioClick su pulsante SX"))
txtTEST.bind("<Double-2>",  		lambda fEv:gEvParam(fEv,"Area testo", "DoppioClick su pulsante CE"))
txtTEST.bind("<Double-3>",  		lambda fEv:gEvParam(fEv,"Area testo", "DoppioClick su pulsante DX"))
txtTEST.bind("<FocusIn>",   		lambda fEv:gEvParam(fEv,"Area testo", "Il widget è stato <Messo a fuoco>"))
txtTEST.bind("<FocusOut>",  		lambda fEv:gEvParam(fEv,"Area testo", "Il widget ha perso la <Messa a fuoco>"))
txtTEST.bind("<B1-Motion>", 		lambda fEv:gEvParam(fEv,"Area testo", "Spostamento sul widget con PSX premuto"))
txtTEST.bind("<B2-Motion>", 		lambda fEv:gEvParam(fEv,"Area testo", "Spostamento sul widget con PCE premuto"))
txtTEST.bind("<B3-Motion>", 		lambda fEv:gEvParam(fEv,"Area testo", "Spostamento sul widget con PDX premuto"))
txtTEST.bind("<ButtonRelease-1>", 	lambda fEv:gEvParam(fEv,"Area testo", "Rilascio Pulsante SX"))
txtTEST.bind("<ButtonRelease-2>", 	lambda fEv:gEvParam(fEv,"Area testo", "Rilascio Pulsante CE"))
txtTEST.bind("<ButtonRelease-3>", 	lambda fEv:gEvParam(fEv,"Area testo", "Rilascio Pulsante DX"))
txtTEST.bind("<Enter>", 			lambda fEv:gEvParam(fEv,"Area testo", "Il puntatore e' ENTRATO nel widget"))
txtTEST.bind("<Leave>", 			lambda fEv:gEvParam(fEv,"Area testo", "Il puntatore e' USCITO dal widget"))
txtTEST.bind("<Key>", 				lambda fEv:gEvParam(fEv,"Area testo", "Pressione di un tasto"))

# "bind" Spinbox
spinTEST.bind("<Button-1>",  		lambda fEv:gEvParam(fEv,"Spin", "Click su pulsante SX", spinTEST.get()))
spinTEST.bind("<Button-2>",  		lambda fEv:gEvParam(fEv,"Spin", "Click su pulsante CE", spinTEST.get()))
spinTEST.bind("<Button-3>",  		lambda fEv:gEvParam(fEv,"Spin", "Click su pulsante DX", spinTEST.get()))
spinTEST.bind("<Button-4>",  		lambda fEv:gEvParam(fEv,"Spin", "Spostato rotellina SU", spinTEST.get()))
spinTEST.bind("<Button-5>",  		lambda fEv:gEvParam(fEv,"Spin", "Spostato rotellina GIU", spinTEST.get()))
spinTEST.bind("<Double-1>",  		lambda fEv:gEvParam(fEv,"Spin", "DoppioClick su pulsante SX", spinTEST.get()))
spinTEST.bind("<Double-2>",  		lambda fEv:gEvParam(fEv,"Spin", "DoppioClick su pulsante CE", spinTEST.get()))
spinTEST.bind("<Double-3>",  		lambda fEv:gEvParam(fEv,"Spin", "DoppioClick su pulsante DX", spinTEST.get()))
spinTEST.bind("<FocusIn>",   		lambda fEv:gEvParam(fEv,"Spin", "Il widget è stato <Messo a fuoco>", spinTEST.get()))
spinTEST.bind("<FocusOut>",  		lambda fEv:gEvParam(fEv,"Spin", "Il widget ha perso la <Messa a fuoco>", spinTEST.get()))
spinTEST.bind("<B1-Motion>", 		lambda fEv:gEvParam(fEv,"Spin", "Spostamento sul widget con PSX premuto", spinTEST.get()))
spinTEST.bind("<B2-Motion>", 		lambda fEv:gEvParam(fEv,"Spin", "Spostamento sul widget con PCE premuto", spinTEST.get()))
spinTEST.bind("<B3-Motion>", 		lambda fEv:gEvParam(fEv,"Spin", "Spostamento sul widget con PDX premuto", spinTEST.get()))
spinTEST.bind("<ButtonRelease-1>", 	lambda fEv:gEvParam(fEv,"Spin", "Rilascio Pulsante SX", spinTEST.get()))
spinTEST.bind("<ButtonRelease-2>", 	lambda fEv:gEvParam(fEv,"Spin", "Rilascio Pulsante CE", spinTEST.get()))
spinTEST.bind("<ButtonRelease-3>", 	lambda fEv:gEvParam(fEv,"Spin", "Rilascio Pulsante DX", spinTEST.get()))
spinTEST.bind("<Enter>", 			lambda fEv:gEvParam(fEv,"Spin", "Il puntatore e' ENTRATO nel widget", spinTEST.get()))
spinTEST.bind("<Leave>", 			lambda fEv:gEvParam(fEv,"Spin", "Il puntatore e' USCITO dal widget", spinTEST.get()))
spinTEST.bind("<Key>", 				lambda fEv:gEvParam(fEv,"Spin", "Pressione di un tasto", spinTEST.get()))

# "bind" Scale
scaleTEST.bind("<Button-1>",  		lambda fEv:gEvParam(fEv,"Scale", "Click su pulsante SX", scaleTEST.get()))
scaleTEST.bind("<Button-2>",  		lambda fEv:gEvParam(fEv,"Scale", "Click su pulsante CE", scaleTEST.get()))
scaleTEST.bind("<Button-3>",  		lambda fEv:gEvParam(fEv,"Scale", "Click su pulsante DX", scaleTEST.get()))
scaleTEST.bind("<Button-4>",  		lambda fEv:gEvParam(fEv,"Scale", "Spostato rotellina SU", scaleTEST.get()))
scaleTEST.bind("<Button-5>",  		lambda fEv:gEvParam(fEv,"Scale", "Spostato rotellina GIU", scaleTEST.get()))
scaleTEST.bind("<Double-1>",  		lambda fEv:gEvParam(fEv,"Scale", "DoppioClick su pulsante SX", scaleTEST.get()))
scaleTEST.bind("<Double-2>",  		lambda fEv:gEvParam(fEv,"Scale", "DoppioClick su pulsante CE", scaleTEST.get()))
scaleTEST.bind("<Double-3>",  		lambda fEv:gEvParam(fEv,"Scale", "DoppioClick su pulsante DX", scaleTEST.get()))
scaleTEST.bind("<FocusIn>",   		lambda fEv:gEvParam(fEv,"Scale", "Il widget è stato <Messo a fuoco>", scaleTEST.get()))
scaleTEST.bind("<FocusOut>",  		lambda fEv:gEvParam(fEv,"Scale", "Il widget ha perso la <Messa a fuoco>", scaleTEST.get()))
scaleTEST.bind("<B1-Motion>", 		lambda fEv:gEvParam(fEv,"Scale", "Spostamento sul widget con PSX premuto", scaleTEST.get()))
scaleTEST.bind("<B2-Motion>", 		lambda fEv:gEvParam(fEv,"Scale", "Spostamento sul widget con PCE premuto", scaleTEST.get()))
scaleTEST.bind("<B3-Motion>", 		lambda fEv:gEvParam(fEv,"Scale", "Spostamento sul widget con PDX premuto", scaleTEST.get()))
scaleTEST.bind("<ButtonRelease-1>", lambda fEv:gEvParam(fEv,"Scale", "Rilascio Pulsante SX", scaleTEST.get()))
scaleTEST.bind("<ButtonRelease-2>", lambda fEv:gEvParam(fEv,"Scale", "Rilascio Pulsante CE", scaleTEST.get()))
scaleTEST.bind("<ButtonRelease-3>", lambda fEv:gEvParam(fEv,"Scale", "Rilascio Pulsante DX", scaleTEST.get()))
scaleTEST.bind("<Enter>", 			lambda fEv:gEvParam(fEv,"Scale", "Il puntatore e' ENTRATO nel widget", scaleTEST.get()))
scaleTEST.bind("<Leave>", 			lambda fEv:gEvParam(fEv,"Scale", "Il puntatore e' USCITO dal widget", scaleTEST.get()))
scaleTEST.bind("<Key>", 			lambda fEv:gEvParam(fEv,"Scale", "Pressione di un tasto", scaleTEST.get()))

fin.mainloop()
