'''
ARGOMENTI:

	- barra dei menu
			Componente delle interfacce grafiche costituita da uno o piu' 
			elementi i quali, una volta attivati, visualizzano un menu a 
			tendina mostrando le operazioni eseguibili dall'utente.


	- tearoff (1=presente, 0=assente)
			Linea tratteggiata che si presenta all'inizio del "menu a discesa"
			che serve a staccarlo per trasformarlo in finestra.

	- functools ->partial / lambda
			In relazione a "command=Messaggio", se viene usata la funzione "Messaggio"
			con dei parametri, il programma non funziona per i seguenti motivi:
				1) La funzione "Messaggio" parte automaticamente all'avvio della finestra
				2) Il "click" sul menu non viene intercettato

				Per utilizzare i parametri senza avere questi inconvenienti si puo' utilizzare 
				la funzione "partial" come nel caso "MENU_2" dell'esempio.

				N.B. - I parametri posssono essere anche piu' di uno


				IN ALTERNATIVA

					si puo' utilizzare una funzione "lambda" ( permette la definizione 
					al volo di piccole funzioni di una sola riga in questo modo 
							"command=lambda:MessageBox(1)" come nel caso "MENU_3"


	- filedialog, messagebox, simpledialog
    
'''

from tkinter import *
from tkinter import messagebox
from tkinter import simpledialog
from tkinter import filedialog
from tkinter import colorchooser
from functools import partial
import os

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


TipiDiFile = [	('Tutti i file', '.*'), 
				('Testo', '.txt'),
				('PDF', '.pdf'),
				('Immagine', '.png')
			]

def Messaggio():
	messagebox.showinfo("Titolo", "Elemento del menu" )


def FileDialog(valore):
	if valore==1:
		ris = filedialog.askopenfilename(	initialdir=os.getcwd(),
                                    		title="Seleziona il file:",
                                    		filetypes=TipiDiFile)
		if ris: messagebox.showinfo("File selezionato:", ris )
	elif valore==2:
		ris=filedialog.askopenfilenames(	initialdir=os.getcwd(),
                                     		title="Seleziona uno o piu' file:",
                                     		filetypes=TipiDiFile)
		if ris: messagebox.showinfo("File selezionati:", ris )
	elif valore==3:
		ris = filedialog.askdirectory(		initialdir=os.getcwd(),
                                    		title="Seleziona la cartella:")
		if ris: messagebox.showinfo("Cartella selezionata:", ris )
	elif valore==4:
		messagebox.showinfo("Titolo", "SALVATO")
	elif valore==5:
		ris = filedialog.asksaveasfilename(	initialdir=os.getcwd(),
                                      		title="Salva file:",
                                      		filetypes=TipiDiFile)
		if ris: messagebox.showinfo("File su cui salvare:", ris )
	else:
		messagebox.showinfo("Titolo", "NON SI SA")


def MessageBox(valore):
	if valore==1:
		messagebox.showinfo("Titolo", "INFO")
	elif valore==2:
		messagebox.showwarning("Titolo", "WARNING")
	elif valore==3:
		messagebox.showerror("Titolo", "ERROR")
	elif valore==4:
		ris=messagebox.askquestion("Titolo", "ASK QUESTION") 			# risultato: yes/no
		messagebox.showinfo("Opzione scelta:", ris)
	elif valore==5:
		ris=messagebox.askokcancel("Titolo", "ASK OK/CANCEL")			# risultato: True/False
		messagebox.showinfo("Opzione scelta:", ris)
	elif valore==6:
		ris=messagebox.askyesno("Titolo", "ASK YES/NO")					# risultato: True/False
		messagebox.showinfo("Opzione scelta:", ris)
	elif valore==7:
		ris=messagebox.askretrycancel("Titolo", "ASK RETRY/CANCEL")		# risultato: True/False
		messagebox.showinfo("Opzione scelta:", ris)
	elif valore==8:
		ris=messagebox.askyesnocancel("Titolo", "ASK YES/NO/CANCEL")	# risultato: True/False/None
		messagebox.showinfo("Opzione scelta:", ris)
	else:
		messagebox.showinfo("Titolo", "NON SI SA")


def SimpleDialog(valore):
	if valore==1:
		ris = simpledialog.askstring("Titolo", "Dammi una stringa:") 	# risultato: Valore/None
		if ris: messagebox.showinfo("Valore inserito:", ris)
	elif valore==2:
		ris = simpledialog.askinteger("Titolo", "Dammi una intero:")	# risultato: Valore/None
		if ris: messagebox.showinfo("Valore inserito:", ris)
	elif valore==3:
		ris = simpledialog.askfloat("Titolo", "Dammi un float")			# risultato: Valore/None
		if ris: messagebox.showinfo("Valore inserito:", ris)
	elif valore==4:
		ris = colorchooser.askcolor(initialcolor=(255, 0, 0))			# risultato: coppia (rgb_color, web_color)/(None/None)
		messagebox.showinfo("Opzione scelta:", ris)
	else:
		messagebox.showinfo("Titolo", "NON SI SA")




fin = Tk()
fin.geometry("400x400+300+50")
fin.title("Applicazione")

# Creazione barra "MENU PRINCIPALE"
bMenu = Menu(fin)

# MENU 1 -------------------------------------------------
# Definizione "Menu_1" da agganciare alla barra del MENU PRINCIPALE
Menu_1 = Menu(bMenu, tearoff=1)
# Aggancio del "Menu_1" a discesa (add_cascade) al MENU PRINCIPALE
bMenu.add_cascade(label="File", menu=Menu_1)
# Inserimento delle voci del menu (add_command)
Menu_1.add_command(label="Apri", command=Messaggio)
Menu_1.add_command(label="Salva", command=Messaggio)
Menu_1.add_command(label="Salva con nome...", command=Messaggio)
# Aggiunta di un separatore
Menu_1.add_separator()
Menu_1.add_command(label="Esci", command=fin.destroy)


# MENU 2 -------------------------------------------------
Menu_2 = Menu(bMenu, tearoff=1)
bMenu.add_cascade(label="<File2>", menu=Menu_2)
Menu_2.add_command(label="Apri file", command=partial(FileDialog, 1))
Menu_2.add_command(label="Apri files", command=partial(FileDialog, 2))
Menu_2.add_command(label="Apri Cartella", command=partial(FileDialog, 3))
Menu_2.add_command(label="Salva", command=partial(FileDialog, 4))
Menu_2.add_command(label="Salva con nome...", command=partial(FileDialog, 5))
Menu_2.add_separator()
Menu_2.add_command(label="Esci", command=fin.destroy)


# Menu 3 -------------------------------------------------
Menu_3 = Menu(bMenu, tearoff=0)
bMenu.add_cascade(label="tkMessageBox", menu=Menu_3)
Menu_3.add_command(label="Info", command=lambda:MessageBox(1))
Menu_3.add_command(label="Warning", command=lambda:MessageBox(2))
Menu_3.add_command(label="Error", command=lambda:MessageBox(3))
Menu_3.add_command(label="Ask Question", command=lambda:MessageBox(4))
Menu_3.add_command(label="Ask Ok/Cancel", command=lambda:MessageBox(5))
Menu_3.add_command(label="Ask Yes/No", command=lambda:MessageBox(6))
Menu_3.add_command(label="Ask Retry/Cancel", command=lambda:MessageBox(7))
Menu_3.add_command(label="Ask Yes/No/Cancel", command=lambda:MessageBox(8))

# Menu 4 -------------------------------------------------
Menu_4 = Menu(bMenu, tearoff=0)
bMenu.add_cascade(label="simpledialog", menu=Menu_4)
Menu_4.add_command(label="Ask String", command=lambda:SimpleDialog(1))
Menu_4.add_command(label="Ask Integer", command=lambda:SimpleDialog(2))
Menu_4.add_command(label="Ask Float", command=lambda:SimpleDialog(3))
Menu_4.add_command(label="Scegli un colore:", command=lambda:SimpleDialog(4))


# Visualizza il menu
fin.config(menu=bMenu)

# Visualizza un messaggio nella finestra principale
msg = Message(text="Ciao, ti piace il giallo come sfondo di questo messaggio?")
msg.config(bg="yellow", font=("courier", 16, "bold"))
msg.pack(fill=X, expand=YES)


fin.mainloop()
