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:

Cool game

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)

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"

results matching ""

    No results matching ""