Python è uno dei linguaggi di programmazione più versatili e popolari al mondo, grazie alla sua semplicità e alla vasta gamma di librerie disponibili. Una delle aree in cui Python eccelle è la creazione di interfacce grafiche (GUI) per applicazioni desktop. In questo articolo, esploreremo come utilizzare la libreria Tkinter per creare un’interfaccia utente che permetta di generare immagini a partire da un testo inserito dall’utente.
L’applicazione che andremo a costruire sarà un generatore di immagini che prende in input un testo, un nome file, un formato (PNG, JPG, GIF) e le dimensioni dell’immagine, per poi generare e salvare un’immagine con il testo centrato. Questo tipo di strumento può essere utile in molte situazioni, come la creazione di banner, immagini per social media, o semplicemente per convertire rapidamente del testo in un formato visivo.
Introduzione a Tkinter e Pillow
Tkinter è la libreria standard di Python per la creazione di interfacce grafiche. È inclusa di default in Python, quindi non è necessario installarla separatamente. Tkinter permette di creare finestre, pulsanti, campi di input e altri elementi dell’interfaccia utente in modo semplice e intuitivo.
Pillow (PIL) è invece una libreria di imaging che permette di manipolare immagini, creare nuove immagini, e salvarle in vari formati. Pillow non è inclusa di default in Python, ma può essere facilmente installata tramite pip:
pip install pillow
Creazione dell’Interfaccia Grafica
Il primo passo per creare la nostra applicazione è progettare l’interfaccia grafica. Utilizzeremo Tkinter per creare una finestra con diversi campi di input:
- Testo: Il testo che l’utente desidera convertire in immagine.
- Nome file: Il nome del file di output (senza estensione).
- Formato: Un menu a tendina per selezionare il formato dell’immagine (PNG, JPG, GIF).
- Larghezza e Altezza: Le dimensioni dell’immagine.
Ecco come appare il codice per creare l’interfaccia:
from tkinter import Tk, Label, Entry, Button, messagebox, StringVar, OptionMenu from PIL import Image, ImageDraw, ImageFont import textwrap def genera_immagine_da_testo(): # Recupera i valori inseriti dall'utente testo = entry_testo.get() nome_file = entry_nome.get() formato = formato_var.get() dimensione = (int(entry_larghezza.get()), int(entry_altezza.get())) # Verifica che tutti i campi siano stati compilati if not testo or not nome_file or not formato or not dimensione: messagebox.showerror("Errore", "Tutti i campi sono obbligatori!") return # Crea l'immagine try: immagine = Image.new('RGB', dimensione, (255, 255, 255)) draw = ImageDraw.Draw(immagine) font = ImageFont.load_default() # Formatta il testo margine = 10 max_caratteri_per_riga = dimensione[0] // (font.size // 2) righe = textwrap.wrap(testo, width=max_caratteri_per_riga) # Calcola l'altezza totale del testo altezza_testo = len(righe) * font.size y_testo = (dimensione[1] - altezza_testo) // 2 # Disegna ogni riga di testo sull'immagine for riga in righe: larghezza_riga = draw.textlength(riga, font=font) x_testo = (dimensione[0] - larghezza_riga) // 2 draw.text((x_testo, y_testo), riga, font=font, fill=(0, 0, 0)) y_testo += font.size # Salva l'immagine nome_file_completo = f"{nome_file}.{formato.lower()}" immagine.save(nome_file_completo, format=formato.upper()) messagebox.showinfo("Successo", f"Immagine salvata come {nome_file_completo}") except Exception as e: messagebox.showerror("Errore", f"Si è verificato un errore: {str(e)}") # Creazione della finestra principale root = Tk() root.title("Generatore di Immagini da Testo") # Etichette e campi di input Label(root, text="Testo:").grid(row=0, column=0, padx=10, pady=10) entry_testo = Entry(root, width=50) entry_testo.grid(row=0, column=1, padx=10, pady=10) Label(root, text="Nome file:").grid(row=1, column=0, padx=10, pady=10) entry_nome = Entry(root, width=50) entry_nome.grid(row=1, column=1, padx=10, pady=10) Label(root, text="Formato:").grid(row=2, column=0, padx=10, pady=10) formati = ["PNG", "JPG", "GIF"] formato_var = StringVar(root) formato_var.set(formati[0]) # Imposta il formato predefinito OptionMenu(root, formato_var, *formati).grid(row=2, column=1, padx=10, pady=10) Label(root, text="Larghezza:").grid(row=3, column=0, padx=10, pady=10) entry_larghezza = Entry(root, width=20) entry_larghezza.grid(row=3, column=1, padx=10, pady=10) Label(root, text="Altezza:").grid(row=4, column=0, padx=10, pady=10) entry_altezza = Entry(root, width=20) entry_altezza.grid(row=4, column=1, padx=10, pady=10) # Pulsante per generare l'immagine Button(root, text="Genera Immagine", command=genera_immagine_da_testo).grid(row=5, column=0, columnspan=2, pady=20) # Avvio dell'interfaccia grafica root.mainloop()
Funzionamento del Codice
- Interfaccia Grafica: Utilizziamo Tkinter per creare una finestra con campi di input per il testo, il nome del file, il formato e le dimensioni dell’immagine. Ogni campo è associato a un’etichetta descrittiva.
- Funzione
genera_immagine_da_testo
: Questa funzione viene chiamata quando l’utente clicca sul pulsante “Genera Immagine”. Recupera i valori inseriti dall’utente, verifica che tutti i campi siano stati compilati, e genera l’immagine utilizzando la libreria Pillow. Il testo viene formattato e centrato nell’immagine, che viene poi salvata con il nome e il formato specificati. - Gestione degli Errori: Se si verifica un errore durante la generazione dell’immagine, viene mostrato un messaggio di errore all’utente.
Esecuzione del Programma
Per eseguire il programma, salva il codice in un file, ad esempio generatore_immagini_gui.py
, e eseguilo con Python:
python generatore_immagini_gui.py
Apparirà una finestra in cui potrai inserire il testo, il nome del file, il formato e le dimensioni dell’immagine. Cliccando su “Genera Immagine”, verrà creato e salvato il file immagine.
Domande Frequenti (FAQ)
1. Posso aggiungere altri formati di immagine?
Sì, puoi estendere il menu a tendina per includere altri formati supportati da Pillow, come BMP o TIFF.
2. Come posso cambiare il font del testo?
Puoi utilizzare un font personalizzato caricandolo con ImageFont.truetype()
. Ad esempio:
font = ImageFont.truetype("arial.ttf", size=40)
3. Posso modificare il colore di sfondo dell’immagine?
Sì, puoi cambiare il colore di sfondo modificando il parametro (255, 255, 255)
nella funzione Image.new()
.
Conclusione
In questo articolo abbiamo visto come creare un’interfaccia grafica con Tkinter per generare immagini a partire da un testo. Abbiamo utilizzato la libreria Pillow per manipolare le immagini e abbiamo creato un’applicazione semplice ma potente che può essere estesa in molti modi.
Ora che hai gli strumenti necessari, ti incoraggio a sperimentare con il codice: prova ad aggiungere nuove funzionalità, come la possibilità di scegliere il colore del testo o di aggiungere immagini di sfondo. La pratica è il modo migliore per imparare e migliorare le tue competenze di programmazione!