Menù, timer, eventi di tastiera, finestre di dialogo
Un'applicazione con interfaccia grafica spesso consente un'interazione sofisticata con l'utente, attraverso i pulsanti, le finestre di dialogo (informative o per la scelta di un file), la gestione degli "eventi di tastiera" (ossia le pressioni dei tasti). Inoltre, può essere utile avere a disposizione un timer per controllare il passare del tempo. Per esemplificare l'uso di queste cose, presenteremo qui una piccola applicazione gioco (non completa), con il seguente aspetto:
Menù
I menù sono realizzati predisponendo una barra agganciata alla finestra principale, nella quale vengono "inserite" le voci principali (add_cascade
), alla quale appartengono le voci che possono essere effettivamente scelte (add_command
):
def setMenu(self):
MenuBar = Menu(self.parent)
self.parent['menu']=MenuBar
FileMenu=Menu(MenuBar)
FileMenu.add_command(label='Open…', command=self.FileLoad)
FileMenu.add_command(label='Save as…', command=self.FileSave)
FileMenu.add_command(label='Quit', command=self.Quit)
HelpMenu=Menu(MenuBar)
HelpMenu.add_command(label='About', command=self.HelpAbout)
MenuBar.add_cascade(label='File', menu=FileMenu)
MenuBar.add_cascade(label='Help', menu=HelpMenu)
Gestione degli eventi di tastiera
La pressione di tasti particolari della tastiera si gestisce con il collegamento (bind) della finestra principale ad una funzione.
self.parent.bind('<Up>', self.UpButton_Click)
self.parent.bind('<Down>', self.DownButton_Click)
self.parent.bind('<Left>', self.LeftButton_Click)
self.parent.bind('<Right>', self.RightButton_Click)
self.parent.bind('q', self.Quit)
Timer
Per usare il timer di tkinter si deve impostare una funzione con il metodo after della finestra principale, specificando il numero di millisecondi dopo i quali la funzione dev'essere richiamata. Se l'evento è ricorrente, nella funzione chiamata bisognerà reimpostare la funzione.
self.parent.after(500, self.MoveObjectDown)
Finestre di dialogo
Per usare le finestre di dialogo, bisogna importare da tkinter esplicitamente le componenti necessarie:
from tkinter import messagebox
from tkinter import filedialog
Messagebox
Messagebox consente di visualizzare messaggi:
messagebox.showinfo(title='THE BIG GAME', message='--- GAME OVER ---')
Filedialog
Filedialog consente di chiedere il nome di un file (da aprire o su cui salvare):
def FileLoad(self):
ftypes = [('Text files', '*.txt'), ('XML Files', '*.xml'), ('All files', '*.*')]
filename = filedialog.askopenfilename(title='Chose a file to open', filetypes=ftypes)
if filename:
messagebox.showinfo(title='File opening', message='I should open file ' + filename)
def FileSave(self):
ftypes = [('Text files', '*.txt'), ('XML Files', '*.xml'), ('All files', '*.*')]
filename = filedialog.asksaveasfilename(title='Chose where to save data', filetypes=ftypes)
if filename:
messagebox.showinfo(title='File saving', message='I should save to file ' + filename)
Finestre secondarie
Una finestra secondaria può essere generata con Toplevel()
. Ad esempio, la finestrella di informazioni sull'autore e sulla licenza può essere richiamata visualizzata con un codice simile al seguente:
def HelpAbout(self):
self.AboutWindow = Toplevel(self.parent)
self.AboutWindow.title('info')
self.AuthorLabel = Label(self.AboutWindow, text='Author: ' + AUTHOR)
self.AuthorLabel.pack()
self.LicenceLabel = Label(self.AboutWindow, text='Licence: ' + LICENCE)
self.LicenceLabel.pack()
self.CloseAboutWindowButton = Button(self.AboutWindow, text='Close', command=self.CloseAboutWindowButton_Click)
self.CloseAboutWindowButton.pack()
def CloseAboutWindowButton_Click(self):
self.AboutWindow.destroy()
Se si desidera che la finestra sia "modale" (ossia che l'input della finestra principale sia inibito fino a quando essa non viene chiusa), sarà necessario aggiungere l'istruzione
self.AboutWindow.grab_set() # questo rende la finestra "modale"