Crea applicazioni desktop professionali con interfacce grafiche in Python
Tkinter è la libreria standard di Python per creare interfacce grafiche (GUI - Graphical User Interface). È inclusa in tutte le installazioni di Python, quindi non richiede installazioni aggiuntive!
Non serve installare nulla, è già disponibile
Funziona su Windows, Mac e Linux senza modifiche
Sintassi semplice, perfetta per iniziare con le GUI
Le applicazioni GUI con Tkinter non funzionano su Google Colab perché richiedono un display grafico desktop.
PyCharm, VS Code o IDE desktop
Anaconda Navigator (Jupyter Notebook locale)
Google Colab / Ambiente cloud
Tkinter crea finestre reali del sistema operativo (come qualsiasi programma che usi ogni giorno). Google Colab è un ambiente server senza interfaccia grafica, quindi non può mostrare finestre.
Implicazione didattica: Questo è perfetto per imparare! Stai creando applicazioni desktop REALI, non script da terminale.
import tkinter as tk: Importa l'intero modulo tkinter con l'alias tk. Questo è il modo standard usato da tutti.
from tkinter import ttk: Importa il modulo ttk (Themed Tkinter) che contiene widget con stili più moderni e uniformi tra diversi sistemi operativi.
tk vs ttk:
| Modulo | Widget | Caratteristiche |
|---|---|---|
tk |
Classici | Stile nativo del sistema operativo |
ttk |
Themed | Stile uniforme cross-platform, più moderno |
root = tk.Tk(): Crea l'oggetto finestra principale.
root: Nome convenzionale per la finestra principale (puoi usare qualsiasi nome)tk.Tk(): Costruttore che crea una nuova finestraroot.title("La Mia Prima App"): Imposta il titolo della finestra.
root.geometry("400x300"): Imposta le dimensioni iniziali.
"400x300": Formato stringa "larghezzaxaltezza""400x300+100+50" (posizione x=100, y=50)root.resizable(True, True): Controlla il ridimensionamento.
| Valore | Primo Parametro | Secondo Parametro |
|---|---|---|
True |
Ridimensionabile orizzontalmente | Ridimensionabile verticalmente |
False |
Larghezza fissa | Altezza fissa |
root.mainloop(): Avvia il loop principale dell'applicazione.
I widget sono gli elementi dell'interfaccia: bottoni, etichette, campi testo, ecc.
| Parametro | Esempio | Descrizione |
|---|---|---|
text |
"Ciao, Tkinter!" |
Testo da visualizzare |
font |
("Arial", 16) |
Tupla: (famiglia, dimensione) o (famiglia, dimensione, stile) |
fg |
"white" o "#FFFFFF" |
Colore testo (foreground) |
bg |
"blue" o "#0000FF" |
Colore sfondo (background) |
padx |
20 |
Spazio orizzontale interno (padding) |
pady |
10 |
Spazio verticale interno (padding) |
anchor |
"w" (west/left) |
Allineamento: n, s, e, w, ne, nw, se, sw, center |
label.pack(): Posiziona il widget nella finestra.
pack(): Layout manager semplice (impilamento automatico)grid() (griglia), place() (posizione assoluta)Funzioni di Callback:
command=saluta: Specifica la funzione da chiamare al clicksaluta non saluta()Parametri Specifici di Button:
| Parametro | Valori Tipici | Effetto |
|---|---|---|
command |
nome_funzione |
Funzione chiamata al click (callback) |
activebackground |
"darkgreen" |
Colore sfondo quando il bottone è premuto |
activeforeground |
"yellow" |
Colore testo quando il bottone è premuto |
relief |
"raised" |
Stile 3D del bordo |
state |
"normal", "disabled" |
Stato del bottone (cliccabile o disabilitato) |
messagebox.showinfo(): Mostra una finestra di dialogo informativa.
showwarning(), showerror(), askyesno(), askokcancel()from tkinter import messageboxentry.get(): Ottiene il testo inserito nell'Entry.
"" se non c'è testoentry.delete(inizio, fine): Cancella testo.
0: Primo caratteretk.END: Costante che indica la fine del testoentry.delete(0, tk.END): Cancella tutto il testoentry.insert(posizione, testo): Inserisce testo.
0: All'iniziotk.END: Alla fineentry.insert(0, "Ciao"): Inserisce "Ciao" all'inizioshow="*": Nasconde i caratteri (per password).
show="*": Mostra asterischishow="#": Mostra cancellettishow="" (default): Mostra testo normaleTkinter offre 3 modi per posizionare i widget: pack(), grid(), place().
| Parametro | Valori | Descrizione |
|---|---|---|
side |
"top" (default), "bottom", "left", "right" |
Lato dove impilare |
fill |
"none", "x", "y", "both" |
Riempimento nello spazio disponibile |
expand |
True/False |
Espande per occupare spazio extra |
padx, pady |
numero (pixel) | Padding esterno orizzontale/verticale |
ipadx, ipady |
numero (pixel) | Padding interno orizzontale/verticale |
anchor |
"n", "s", "e", "w", "center", ecc. |
Posizione nel contenitore |
Regole di pack():
side="top", fill="none", expand=Falsepack()grid() nello stesso contenitore| Parametro | Descrizione | Esempio |
|---|---|---|
row, column |
Posizione nella griglia (0-based) | row=0, column=0 (alto-sinistra) |
rowspan, columnspan |
Numero di righe/colonne da occupare | columnspan=2 (occupa 2 colonne) |
sticky |
Allineamento nella cella (n,s,e,w,ne,nw,se,sw) | sticky="w" (allinea a sinistra) |
padx, pady |
Padding esterno | padx=10, pady=5 |
ipadx, ipady |
Padding interno | ipadx=5, ipady=2 |
root.grid_columnconfigure(): Configura il comportamento delle colonne.
weight=1: La colonna si espande con la finestraweight=0 (default): Dimensione fissaweight=3: Si espande 3 volte più della colonna con weight=1tk.Frame(): Contenitore per gruppi di widget.
grid() per form, dashboard e applicazioni complesse.
Usa pack() per layout semplici e rapidi.
Evita place() se non necessario (poco responsive).
tk.StringVar(): Variabile speciale Tkinter.
set(): Imposta valoreget(): Ottiene valoreIntVar(), DoubleVar(), BooleanVar()Programmazione a Oggetti (OOP):
class Calcolatrice:: Definisce una classe__init__(): Costruttore (inizializza l'oggetto)self: Riferimento all'oggetto stessoeval(): Valuta un'espressione Python.
lambda in command:
lambda t=testo: self.pressione_bottone(t)testotestoCreeremo un sistema completo per la gestione dei pazienti in una clinica medica.
Lavori come sviluppatore per una clinica che ha bisogno di digitalizzare la gestione dei pazienti. L'applicazione deve permettere:
Perché usare dizionari?
JSON per persistenza:
json.dump(): Scrive dati Python in formato JSONjson.load(): Legge dati JSON in Pythonindent=2: Formatta con indentazione (leggibile)ensure_ascii=False: Supporta caratteri non-ASCIItry-except per error handling:
try: Prova a eseguire codice che potrebbe fallireexcept FileNotFoundError: Gestisce file non trovatoexcept Exception as e: Gestisce qualsiasi erroredatetime per gestione date:
datetime.now(): Data/ora correntestrftime(): Formatta data come stringastrptime(): Converte stringa in data%d/%m/%Y: Formato giorno/mese/annoCSV per esportazione:
csv.DictWriter(): Scrive dizionari in CSVwriteheader(): Scrive intestazioni colonnewriterows(): Scrive tutti i datittk.Treeview(): Tabella avanzata.
columns=colonne: Definisce le colonneshow="headings": Mostra solo intestazioni (no albero)height=15: Numero righe visibiliheading(): Configura intestazione colonnacolumn(): Configura dimensione colonnattk.Scrollbar(): Barra di scorrimento.
orient="vertical": Orientamento verticalecommand=tree.yview: Connetti al Treeviewtree.configure(yscrollcommand=scrollbar.set): Connetti reciprocamentettk.Style(): Personalizzazione stili.
theme_use('clam'): Tema modernoconfigure(): Definisce stili personalizzatiStyle.TLabel: Notazione per stiliEvent Binding:
bind('<>', funzione) : Selezione rigabind('', funzione) : Doppio clicklambda e: funzione(): Lambda per ignorare parametro eventoCrea un'applicazione per gestire una lista di cose da fare con:
Crea un convertitore con interfaccia grafica che converta:
Crea il gioco Memory (coppie di carte) con:
command=funzione non command=funzione()Tutti gli esercizi di questo modulo vanno eseguiti sul tuo computer, non su Colab. Se incontri errori tipo "no display name" o "$DISPLAY environment variable", significa che stai cercando di eseguire su un ambiente senza display grafico.
✅ Ambienti compatibili:
In questa lezione hai imparato: