giovedì 26 febbraio 2026

Corso di Programmazione Strutturata e OOP: 7 Design dell’interfaccia utente


🎨 7 Design dell’Interfaccia Utente

🎯 Obiettivi Formativi

  • Comprendere i concetti fondamentali di UI (User Interface) e UX (User Experience)
  • Imparare a distinguere e progettare interfacce testuali, grafiche e web
  • Utilizzare librerie Python per la realizzazione di interfacce interattive
  • Applicare principi di semplicità, coerenza e usabilità nel design

📚 Contenuti Teorici

🔹 1. Concetti Base di UI/UX

  • Differenza tra UI (aspetto) e UX (esperienza utente)
  • Principi fondamentali: chiarezza, consistenza, feedback, tolleranza agli errori
  • Errori comuni nel design dell’interfaccia

🔹 2. Tipologie di Interfacce

  • Testuali (CLI): linee di comando, menu numerici, prompt
  • Grafiche (GUI): pulsanti, finestre, etichette, slider
  • Web-based: moduli HTML, CSS, JavaScript, responsive design

🔹 3. Librerie grafiche per Python

  • Tkinter – semplice, integrata, perfetta per GUI di base
  • PyGame – ideale per giochi e interfacce grafiche dinamiche
  • PyQt – per progetti più complessi e professionali (multifinestra)

🔹 4. Progettare un’interfaccia usabile

  • Workflow di progettazione: mockup → wireframe → codice
  • Concetti di accessibilità, gerarchia visiva, e affordance
  • Coerenza tra elementi: layout, colori, comportamento

🛠️ Attività Pratiche

🧮 1. Creare una calcolatrice GUI con Tkinter

  • Obiettivo: progettare una semplice calcolatrice (somma, sottrazione, moltiplicazione, divisione)
  • Funzioni: display numerico, bottoni numerici e operatori, gestione errori
  • Estensione facoltativa: modalità scientifica

🖥️ 2. Sviluppare un menù interattivo da console

  • Progettare un'interfaccia a scelta multipla da terminale (es. menu di un'app)
  • Navigazione tramite input numerico
  • Esempi: diario digitale, agenda, gestione liste

🔍 3. Analizzare e migliorare un’interfaccia esistente

  • Scegliere un’interfaccia reale (app mobile, software desktop, sito web)
  • Valutare in base ai principi UX/UI: intuitività, estetica, efficacia
  • Proporre modifiche migliorative tramite wireframe o descrizione tecnica

🧪 Test e Verifica

  • Quiz teorico a scelta multipla su concetti UI/UX, librerie e principi di design
  • Check-list di valutazione per analizzare una GUI esistente (rubrica)
  • Revisione peer-to-peer dei progetti degli studenti (valutazione tra pari)

🧰 Materiali Extra

  • Template GUI Tkinter di base da personalizzare
  • Strumenti online per mockup: Figma, Draw.io, Balsamiq
  • Mini-guida illustrata: “10 regole d’oro della UX”

💬 Discussione finale

“La buona interfaccia si dimentica, la cattiva si fa notare.”
Riflessione collettiva: quali sono le app o i siti con le interfacce migliori secondo te?
Qual è il confine tra funzionalità e bellezza nel design?

mercoledì 25 febbraio 2026

Corso di Programmazione Strutturata e OOP: 6 IDE e ambienti di sviluppo


🔧 6 IDE e Ambienti di Sviluppo

🎯 Obiettivi:

  • Comprendere cos’è un IDE e il suo ruolo nella produttività del programmatore
  • Acquisire dimestichezza con ambienti professionali e strumenti integrati
  • Configurare, esplorare e usare ambienti come Thonny, VS Code, PyCharm e Replit
  • Avviare un piccolo progetto software, con controllo versioni base

🔍 Cos’è un IDE?

Un IDE (Integrated Development Environment) è un ambiente integrato che semplifica la scrittura, l’esecuzione, il debug e la gestione del codice. Include:

  • Editor di codice (con evidenziazione della sintassi)
  • Terminale integrato
  • Strumenti di debug (punti di interruzione, variabili in tempo reale)
  • Autocompletamento e linting
  • Gestione dei file di progetto
  • Integrazione con sistemi di versionamento (Git)
⚖️ Confronto tra IDE
IDE Adatto per… Pro Contro
Thonny Principianti in Python Interfaccia semplice, installazione veloce Limitato per progetti grandi
VS Code Tutti i linguaggi Estensioni infinite, leggero, Git integrato Richiede configurazione iniziale
PyCharm Python avanzato Potente, supporto completo per Django, Flask Pesante e richiede licenza Pro per alcune funzioni
Replit Lavoro in cloud Nessuna installazione, condivisione facile Prestazioni limitate, meno controllo su ambienti
🏗️ Struttura di un progetto software (esempio base)

Un progetto professionale è composto da:

/mia-app/
├── main.py                # Codice principale
├── /modules/             # File modulari
│   └── util.py
├── requirements.txt      # Librerie da installare
├── README.md             # Documentazione del progetto
├── .gitignore            # File da escludere dal controllo di versione
└── /venv/                # Ambiente virtuale (opzionale)
🧰 Uso integrato degli strumenti
Strumento Funzione
Editor Scrittura del codice con evidenziazione e suggerimenti
Terminale Esecuzione di comandi, script, installazione pacchetti
Debugger Trovare errori tramite breakpoints e ispezione
Controllo versione (Git) Salvare versioni del progetto, collaborare in team

🧪 Attività pratiche

⚙️ 1. Configurare un ambiente di sviluppo completo

  • Installare VS Code o Thonny
  • Installare Python, Git
  • Aggiungere estensioni: Python, GitLens (su VS Code)
  • Configurare l’ambiente virtuale (python -m venv venv)

💡 2. Progetto guida: una mini-app in Python

Obiettivo: creare una calcolatrice base da terminale con struttura modulare

Passaggi:

  • Creare una cartella calcolatrice
  • Scrivere main.py e una funzione in modules/operazioni.py
  • Avviare da terminale: python main.py
  • Eseguire debug passo passo

Ecco la conclusione del modulo, con l'ultima attività completata, un test di verifica e uno spunto per il dialogo in classe o nel blog.

🌐 3. Introduzione al controllo versione con Git (concetti base)

Comando Git Cosa fa
git init Inizializza un repository
git add . Aggiunge file al tracking
git commit -m "messaggio" Salva una versione del progetto
git status Mostra lo stato attuale dei file
git log Elenco dei commit effettuati

👉 Puoi usare Git anche da VS Code, grazie al pannello "Source Control", per una gestione visiva più intuitiva.

🧪 Test di verifica (4 domande)

  1. Cos’è un IDE e quale delle seguenti NON è una sua funzione?
    A) Evidenziazione della sintassi
    B) Esecuzione del codice
    C) Installazione automatica del sistema operativo
    D) Debug interattivo

  2. Quale IDE è consigliato per principianti in Python?
    A) Visual Studio
    B) PyCharm
    C) Thonny
    D) Replit

  3. Cosa fa il comando git commit?
    A) Elimina il progetto
    B) Invia il progetto via email
    C) Crea un salvataggio dello stato attuale
    D) Installa nuove librerie

  4. Quale file contiene l’elenco delle librerie usate in un progetto Python?
    A) .gitignore
    B) README.md
    C) main.py
    D) requirements.txt

💬 Riflessione finale

💡 Domanda per la discussione:
Secondo te, è meglio iniziare con un IDE semplice e poi passare a strumenti professionali, o è utile affrontare subito ambienti più completi come VS Code o PyCharm?

📌 Conclusione

Gli IDE non sono solo "editor": sono ambienti completi di lavoro, fondamentali per scrivere codice in modo efficiente e professionale.
Imparare a usarli significa diventare sviluppatori consapevoli, capaci non solo di scrivere codice, ma di gestire, testare e documentare progetti reali.
E con Git, si inizia anche a ragionare in ottica di lavoro di squadra e versionamento, competenze chiave in ogni ambito software moderno.


martedì 24 febbraio 2026

Corso di Programmazione Strutturata e OOP: 5 Gestione della memoria

 


💾 5 Gestione della Memoria

Quando programmiamo, ogni dato che utilizziamo – numeri, stringhe, immagini, strutture complesse – deve essere memorizzato in uno spazio fisico: la memoria RAM. Comprendere come questa viene organizzata e gestita significa entrare nel livello strutturale dell’informatica, dove efficienza, velocità e stabilità del software dipendono da scelte progettuali consapevoli.

La gestione della memoria non è solo un dettaglio tecnico: è uno degli elementi che distingue un codice “che funziona” da un codice robusto, scalabile e performante.

📌 Cos'è la memoria in un programma

La memoria è uno spazio indirizzabile composto da celle numerate (indirizzi). Ogni cella può contenere una quantità limitata di dati. Quando scriviamo:

x = 5

accadono diverse operazioni invisibili:

  1. Viene creato un oggetto intero con valore 5.
  2. Questo oggetto viene allocato in memoria.
  3. Il nome x diventa un riferimento a quell’oggetto.

È importante comprendere che in Python le variabili non contengono direttamente il valore, ma un riferimento a un oggetto memorizzato altrove.

Stack e Heap (concetto generale)

In molti linguaggi la memoria si divide concettualmente in:

  • Stack → memoria veloce, organizzata in modo strutturato (variabili locali, chiamate di funzione).
  • Heap → memoria dinamica, usata per oggetti creati durante l’esecuzione.

Python gestisce automaticamente queste aree, ma internamente utilizza meccanismi simili.

📦 Variabili, strutture dati e spazio occupato

🔹 Variabili semplici

Un intero (int) o un booleano occupano meno memoria rispetto a strutture complesse, ma in Python anche gli interi sono oggetti, quindi hanno un overhead interno (metadati, gestione del tipo, contatore di riferimenti).

Esempio:

a = 10
b = 10

In Python, piccoli interi possono essere condivisi (ottimizzazione interna), quindi a e b possono riferirsi allo stesso oggetto in memoria.

🔹 Liste

Una lista non contiene direttamente i valori, ma riferimenti agli oggetti.

lista = [1, 2, 3]

In memoria abbiamo:

  • L’oggetto lista
  • Tre oggetti intero
  • Tre riferimenti nella lista

Questo significa che una lista cresce in modo dinamico e può richiedere riallocazioni di memoria quando aumenta di dimensione.

🔹 Dizionari

I dizionari utilizzano tabelle hash. Ogni elemento richiede:

  • Chiave
  • Valore
  • Calcolo hash
  • Struttura di gestione collisioni

Sono estremamente veloci nelle ricerche, ma consumano più memoria rispetto a una lista equivalente.

🔹 Array vs Liste

Strutture come gli array (ad esempio tramite librerie scientifiche) sono più efficienti perché memorizzano dati omogenei in modo contiguo, riducendo overhead e migliorando la località di memoria.

📏 Cosa significa “occupare spazio”?

Ogni oggetto occupa:

  • Spazio per il valore
  • Spazio per il tipo
  • Spazio per il contatore di riferimenti
  • Eventuale spazio per strutture interne

Un programma è “pesante” quando:

  • Crea troppi oggetti inutili
  • Duplica dati invece di riutilizzarli
  • Mantiene riferimenti non necessari
  • Usa strutture complesse quando non servono

Esempio inefficiente:

numeri = []
for i in range(1000000):
    numeri.append(i)

Se i dati non servono tutti contemporaneamente, una soluzione più efficiente potrebbe essere usare un generatore, che non carica tutto in memoria.

🧹 Garbage Collection in Python

Python utilizza due meccanismi principali:

1️⃣ Reference Counting

Ogni oggetto ha un contatore di riferimenti. Quando il contatore scende a zero, l’oggetto viene eliminato.

a = [1, 2, 3]
b = a
del a

L’oggetto non viene eliminato finché b esiste.

2️⃣ Garbage Collector Ciclico

Gestisce i riferimenti circolari, cioè oggetti che si riferiscono tra loro impedendo al contatore di scendere a zero.

Esempio concettuale:

a = []
b = []
a.append(b)
b.append(a)

Qui i due oggetti si referenziano reciprocamente.

Python interviene periodicamente per liberare memoria in questi casi.

⚠ Tuttavia, il Garbage Collector non è una soluzione magica: mantenere oggetti inutilizzati rallenta comunque il sistema.

⚠️ Errori comuni

❌ Variabili non inizializzate

Provocano errori di runtime e indicano cattiva gestione dello stato del programma.

❌ Sovrascrittura involontaria

lista = [1,2,3]
lista = 5

Il nome cambia significato, generando potenziali bug logici.

❌ Copie inutili

nuova_lista = lista[:]

Se non necessario, questa operazione raddoppia l’uso di memoria.

❌ Memory leak logici

In Python non sono comuni come in C/C++, ma possono verificarsi quando oggetti restano referenziati senza necessità.

🚀 Strategie per scrivere codice più efficiente

  • Usare generatori (yield) per grandi sequenze
  • Eliminare variabili inutilizzate (del)
  • Riutilizzare strutture dati quando possibile
  • Scegliere la struttura dati più adatta
  • Evitare copie profonde non necessarie
  • Profilare la memoria con strumenti dedicati

🔬 Attività pratiche approfondite

🔎 1. Visualizzazione della memoria

Utilizzare strumenti didattici come:

  • pythontutor.com

Osservare:

  • Creazione oggetti
  • Riferimenti
  • Eliminazione variabili

Obiettivo: sviluppare consapevolezza visiva dei meccanismi interni.

📊 2. Analisi comparata

Confrontare:

Versione inefficiente

lista = [i for i in range(1000000)]
somma = sum(lista)

Versione ottimizzata

somma = sum(i for i in range(1000000))

Misurare:

  • Tempo di esecuzione
  • Consumo di memoria

🧪 3. Laboratorio guidato

Progetto: analizzatore di dati numerici

Obiettivo:

  • Leggere numeri
  • Calcolare media
  • Non conservare dati inutili

Soluzione efficiente:

  • Elaborazione progressiva
  • Uso minimo di memoria
  • Nessuna lista intermedia

🎯 Conclusione

La gestione della memoria è il punto di incontro tra teoria dell’informazione, architettura dei calcolatori e qualità del software.

Comprendere:

  • Come vengono allocati gli oggetti
  • Come funzionano i riferimenti
  • Quando la memoria viene liberata
  • Come scegliere le strutture dati

significa scrivere programmi più veloci, più puliti e più professionali.

Un buon programmatore non pensa solo a “far funzionare” il codice: pensa a come occupa lo spazio, quanto consuma e quanto può scalare nel tempo.

🧪 Verifica le tue conoscenze

1. Cosa fa la garbage collection in Python?

2. Cosa succede se usi una variabile non inizializzata?

3. Quale delle seguenti strutture occupa in genere più memoria?

Punteggio: 0/3

lunedì 23 febbraio 2026

Corso di Programmazione Strutturata e OOP: 4 Debugging trovare e correggere errori

 


🔧 4 DEBUGGING: TROVARE E CORREGGERE ERRORI

Questa guida è strutturata per trasformare il debugging da momento di frustrazione a processo metodico di indagine scientifica. Debuggare non significa solo "aggiustare il codice", ma comprendere profondamente il flusso d'esecuzione del software.

1. Tassonomia degli Errori: Identificare il Nemico

In Python, non tutti gli errori si manifestano allo stesso modo. Saperli distinguere è il primo passo per risolverli.

  • Errori Sintattici (Syntax Errors): Sono violazioni delle regole grammaticali del linguaggio. Il codice non viene nemmeno avviato.

    • Esempio: if x = 5: (manca il doppio uguale) o una parentesi non chiusa.

  • Errori di Runtime (Exceptions): Il codice è scritto bene, ma accade qualcosa di imprevisto durante l'esecuzione che il computer non sa gestire.

    • Esempio: 10 / 0 (ZeroDivisionError) o cercare di aprire un file che non esiste.

  • Errori Logici (Semantic Errors): I più insidiosi. Il programma gira senza errori, ma il risultato è sbagliato.

    • Esempio: Calcolare la media dividendo per un numero errato o usare > al posto di <.

2. Strategie di Debugging: L'Approccio Metodico

Invece di cambiare il codice a caso sperando che funzioni, segui queste tecniche:

  1. Isolamento (Divide et Impera): Se hai un programma di 100 righe, commentane una parte o sposta le funzioni sospette in un file separato per testarle singolarmente.

  2. Stampe di Controllo (Print Debugging): Inserire print(f"Valore di x: {x}") prima e dopo un'operazione critica per verificare se i dati sono quelli attesi.

  3. Rubber Duck Debugging: Spiegare il codice riga per riga a un oggetto inanimato (o a un collega). Spesso l'errore balza all'occhio nell'atto di verbalizzare la logica.

3. Strumenti Avanzati: Usare l'IDE come un Chirurgo

I moderni ambienti di sviluppo (IDE) offrono strumenti molto più potenti della semplice stampa a video.

Breakpoints e Step Execution

  • Breakpoint: Un "posto di blocco" che metti su una riga di codice. L'esecuzione si fermerà esattamente lì.

  • Step Over: Esegue la riga corrente e passa alla successiva.

  • Step Into: Entra dentro una funzione per vedere cosa succede al suo interno.

  • Variable Watch: Una finestra che mostra il valore di tutte le variabili attive. Se vedi un None dove ti aspetti un numero, hai trovato il colpevole.

Consiglio didattico: Su Thonny, l'icona della "fogliolina" (Debug current script) permette di vedere Python che valuta ogni singola sotto-espressione, ideale per i principianti.

4. Decifrare il Traceback (Il Messaggio di Errore)

Il Traceback è la "scatola nera" del tuo crash. Va letto dal basso verso l'alto:

  1. L'ultima riga ti dice cosa è successo (es. NameError: name 'y' is not defined).

  2. Le righe precedenti ti dicono dove è successo (file e numero di riga).

5. Attività Didattiche Proposte

AttivitàDescrizioneObiettivo
Caccia al BugFornire un codice che calcola l'area del cerchio ma usa + invece di *.Distinguere tra errore logico e sintattico.
Diario del DebugChiedere allo studente di scrivere: "Cosa pensavo facesse il codice" vs "Cosa faceva davvero".Sviluppare metacognizione.
Analisi del FlussoUsare il debugger di VS Code per monitorare un ciclo for che non termina mai.Capire il controllo di flusso e le condizioni di uscita.

Corso di Programmazione Strutturata e OOP: 7 Design dell’interfaccia utente

🎨 7  Design dell’Interfaccia Utente 🎯 Obiettivi Formativi Comprendere i concetti fondamentali di UI (User Interface) e UX (User Exper...