Interfacce grafiche con Tkinter
Perché ti serve Tkinter per le interfacce grafiche
Section titled “Perché ti serve Tkinter per le interfacce grafiche”Finora i tuoi programmi comunicano con l’utente tramite il terminale: testo che appare e testo che viene scritto. Con Tkinter puoi creare vere finestre grafiche con pulsanti, campi di testo, menu a tendina — come i programmi che usi ogni giorno.
Cos’è Tkinter?
Section titled “Cos’è Tkinter?”Tkinter è la libreria per creare interfacce grafiche già inclusa in Python. Non devi installare nulla. Permette di creare finestre con tutti i classici elementi: etichette, pulsanti, caselle di testo, caselle di spunta, e molto altro.
La prima finestra
Section titled “La prima finestra”import tkinter as tk
# Crea la finestra principaleroot = tk.Tk()root.title("La mia prima finestra")root.geometry("400x300") # larghezza × altezza in pixel
# Avvia il "loop degli eventi" — mantiene la finestra aperta e risponde ai clickroot.mainloop()Il metodo mainloop() è fondamentale: è il ciclo che mantiene la finestra in vita e reagisce a tutto ciò che l’utente fa (click, digitazione, ecc.).
I componenti principali (Widget)
Section titled “I componenti principali (Widget)”In Tkinter, ogni elemento visibile si chiama widget.
Label — testo fisso
Section titled “Label — testo fisso”import tkinter as tk
root = tk.Tk()
# Crea un'etichetta di testoetichetta = tk.Label(root, text="Ciao, mondo!", font=("Arial", 16))etichetta.pack(pady=20) # pack() posiziona il widget nella finestra
root.mainloop()Button — pulsante cliccabile
Section titled “Button — pulsante cliccabile”import tkinter as tk
def saluta(): print("Ciao!") # Questa funzione viene chiamata al click
root = tk.Tk()
pulsante = tk.Button(root, text="Clicca qui!", command=saluta)pulsante.pack(pady=20)
root.mainloop()command=saluta indica quale funzione chiamare quando il pulsante viene premuto.
Entry — campo per inserire testo
Section titled “Entry — campo per inserire testo”import tkinter as tk
root = tk.Tk()
# Crea un campo dove l'utente può scriverecampo = tk.Entry(root, width=30)campo.pack(pady=10)
def leggi_input(): testo = campo.get() # Leggi il testo scritto dall'utente print(f"Hai scritto: {testo}")
pulsante = tk.Button(root, text="Leggi", command=leggi_input)pulsante.pack()
root.mainloop()Esempio completo: app di saluto
Section titled “Esempio completo: app di saluto”Metti insieme Label, Entry e Button per fare una piccola app interattiva:
import tkinter as tk
def saluta(): nome = campo_nome.get() if nome: etichetta_risultato.config(text=f"Ciao, {nome}!") else: etichetta_risultato.config(text="Inserisci un nome!")
root = tk.Tk()root.title("App di saluto")root.geometry("300x200")
# Istruzione per l'utentetk.Label(root, text="Inserisci il tuo nome:").pack(pady=10)
# Campo di testocampo_nome = tk.Entry(root, width=25)campo_nome.pack()
# Pulsantetk.Button(root, text="Saluta", command=saluta).pack(pady=10)
# Etichetta per mostrare il risultato (inizialmente vuota)etichetta_risultato = tk.Label(root, text="", font=("Arial", 14))etichetta_risultato.pack()
root.mainloop()Posizionare i widget in griglia con grid()
Section titled “Posizionare i widget in griglia con grid()”pack() mette i widget uno sotto l’altro. Con grid() puoi posizionarli in una tabella di righe e colonne — utile per form o calcolatrici:
import tkinter as tk
root = tk.Tk()root.title("Calcolatrice semplice")
# Riga 0: etichetta e campo per il primo numerotk.Label(root, text="Primo numero:").grid(row=0, column=0, padx=5, pady=5)campo_a = tk.Entry(root)campo_a.grid(row=0, column=1)
# Riga 1: etichetta e campo per il secondo numerotk.Label(root, text="Secondo numero:").grid(row=1, column=0, padx=5, pady=5)campo_b = tk.Entry(root)campo_b.grid(row=1, column=1)
def calcola(): try: a = float(campo_a.get()) b = float(campo_b.get()) etichetta_ris.config(text=f"Somma: {a + b}") except ValueError: etichetta_ris.config(text="Inserisci numeri validi!")
# Riga 2: pulsante che occupa entrambe le colonnetk.Button(root, text="Somma", command=calcola).grid(row=2, column=0, columnspan=2, pady=10)
# Riga 3: etichetta risultatoetichetta_ris = tk.Label(root, text="")etichetta_ris.grid(row=3, column=0, columnspan=2)
root.mainloop()Altri widget utili
Section titled “Altri widget utili”import tkinter as tk
root = tk.Tk()
# Text: area di testo su più righe (come un piccolo editor)area = tk.Text(root, height=5, width=30)area.pack()
# Checkbutton: casella di spuntavar_check = tk.BooleanVar()check = tk.Checkbutton(root, text="Accetta i termini", variable=var_check)check.pack()
# Radiobutton: scelta esclusiva tra opzionivar_radio = tk.StringVar(value="mela")for frutto in ["mela", "banana", "uva"]: tk.Radiobutton(root, text=frutto, variable=var_radio, value=frutto).pack()
# Scale: cursore scorrevolecursore = tk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL)cursore.pack()
root.mainloop()Finestre di dialogo
Section titled “Finestre di dialogo”Tkinter ha anche finestre di dialogo già pronte — quelle che compaiono davanti alla finestra principale con un messaggio o una domanda:
import tkinter as tkfrom tkinter import messagebox
root = tk.Tk()
def mostra_info(): # Finestra di informazione con un solo pulsante OK messagebox.showinfo("Info", "Operazione completata!")
def chiedi_conferma(): # Finestra con pulsanti Sì e No risposta = messagebox.askyesno("Conferma", "Sei sicuro di voler uscire?") if risposta: root.quit() # Chiudi il programma
tk.Button(root, text="Mostra info", command=mostra_info).pack(pady=5)tk.Button(root, text="Esci", command=chiedi_conferma).pack(pady=5)
root.mainloop()