Python
Python
Appunti di Python
Scritto da Giusti Gianni [email protected]
Appunti di Python
Indice generale
Che cosa contiene questo documento...........................................................................3 Qualche ringraziamento...............................................................................................3 Perch ho deciso di scrivere il testo.............................................................................3 Gli strumenti di python scelti per lo sviluppo.............................................................3 Informazioni utili per gli utenti MacOS (di Enrico Franchi) .....................................4 Da dove iniziamo..........................................................................................................6 E adesso iniziamo!!......................................................................................................6 Le Variabili...................................................................................................................7 Input da tastiera..........................................................................................................10 Liste, dizionari e tuple................................................................................................11 Istruzioni di base.........................................................................................................13 Funzioni e Moduli......................................................................................................16 Leggere e scrivere in un file.......................................................................................18 Facciamo il nostro primo vero programma, un agenda..........................................18 Che cos' Glade...........................................................................................................29 Primo incontro con Glade...........................................................................................30 Finestra Glade.............................................................................................................30 Primi passi con Glade.................................................................................................32 Agganciare python all'interfaccia creata da Glade.................................................42 Propriet e segnali (eventi).........................................................................................43 Creare gli eventi .........................................................................................................44 Ricerca/Inserisci/Elimina Il cerchio si stringe........................................................45
Appunti di Python
Qualche ringraziamento
Prima di iniziare vorrei fare alcuni ringraziamenti (in ordine sparso): Stefano Pardini (http://www.compaiuto.it/) e Comick (http://www.comick.net/) per le pubblicazioni sul web. Panther e Zengar Zambolt per le correzioni e gli utili consigli Queste persone sono reperibili sul forum del LUG Versilia Lucca Massa e Carrara (come me tra l'altro) www.tivedotonico.it redclay per il link a glade e pygtk per windows (redclay lo trovate sul NG di python) Enrico Franchi per le utili informazioni su MacOS (la sezione riguardante MacOS stata scritta da lui). Il suo indirizzo email [email protected]
Appunti di Python ovviamente, sono perfettamente integrati con gnome (il mio desktop manager preferito). Come database ho scelto MySql, ma solo per semplicit e portabilit, visto che sono all'inizio con Python, ho cercato gli strumenti pi semplici, in modo da concentrarmi unicamente sullo sviluppo. Ok, adesso che vi ho detto gli strumenti che user, se volete seguire la mia strada, dovrete procurarvi: 1) Python 2.3 (http://www.python.org/2.3/) 2) MySql per windows e per Linux (www.mysql.com). 3) Glade (http://glade.gnome.org) (solo per gli utenti Linux). Disponibile su tutte le distribuzioni. Un ringraziamento particolare a redclay che mi ha postato questo link: http://www.pcpm.ucl.ac.be/~gustin/win32_ports/pygtk.html in cui, gli utenti windows, possono trovare Glade per windows (di cui ignoravo l'esistenza). Gli utenti windows che installano i pacchetti, si ricordino di inserire nel loro path il percorso delle librerie GTK: C:\Programmi\File comuni\GTK\2.0\bin 4) Il supporto per usare MySql con python: mysql-python (http://sourceforge.net/projects/mysqlpython). 5) I binding pyGTK (http://www.daa.com.au/~james/software/pygtk/). 6) Le librerie GTK per windows (ovviamente solo su windows: http://www.dropline.net/gtk/download.php). 7) Un editor di testo a vostra scelta, meglio se supporta la sintassi colorata per python (io uso bluefish, ma potete usare vi, emacs, quanta o quello che vi piace di pi). Qualcuno si star chiedendo ci metter una vita ad installare il tutto!... non cos: I pacchetti non sono grandi (escluse le librerie GTK per windows: 5 Mb ca) Le installazioni sono estremamente semplici. Sotto windows tutto automatico; sotto linux, probabilmente troverete tutti i pacchetti su i cd della vostra distribuzione. Lo sviluppo si svolger tutto sotto linux (si mettano l'anima in pace gli utenti windows), ma le applicazioni generate funzioneranno su entrambe le piattaforme. Tra i pacchetti installati, avrete notato Glade. Questo programma ci permetter di disegnare le finestre. E' estremamente semplice da usare e ha tutto il necessario...in poche parole: semplice ed essenziale (ottimo per chi inizia). Chi si aspetta di iniziare a disegnare form, rimmarr deluso: il passo successivo sar quello di iniziare a programmare piccoli esempi senza gui. Questo modo di procedere ci servir per imparare le poche istruzioni di python. S, avete capito bene, python ha poche istruzioni, il resto sono moduli aggiuntive che non tratteremo in questo tutorial.
Appunti di Python programmare con Carbon conviene semplicemente leggere la documentazione Apple per il Framework e poi guardare qualche esempio scritto in Python. Ad ogni modo la 'traduzione' dovrebbe essere un compito abbastanza semplice. Per Cocoa invece il sito di riferimento e`: http://pyobjc.sourceforge.net/ Cocoa e` un framework molto ben fatto e comodo, originariamente scritto in ObjectiveC e accessibile anche da Java e ora da Python. Per scrivere applicazioni complete e 'mac-only' questa e` probabilmente la strada migliore. Per MacOS X sono anche disponibili anche alcune librerie multipiattaforma. C'e` Tkinter sia in versione nativa che in versione X11. Delle soluzioni per X11 parlero` in seguito. Ad ogni modo qui viene spiegato come fare l'installazione http://www.astro.washington.edu/owen/PythonOnMacOSX.html Brevemente e` necessario scaricare il pacchetto Tcl/Tk aqua da qui: http://tcltkaqua.sourceforge.net/ e in seguito MacPython: http://homepages.cwi.nl/~jack/macpython/ (Quest'ultimo e` comunque consigliatissimo, poiche` va a 'completare' la distribizione Python di Apple, anche se non si intende usare Tkinter) A questo punto si puo` usare PacketManager, incluso in MacPython per installare il pacchetto Tkinter. Tkinter e` davvero facile da usare, tuttavia non e` estremamente accattivante e sembra sempre un po' alieno. Una soluzione molto piu` 'bella' dal punto di vista visuale e` senza dubbio QT. Trolltech rilascia una versione GPL delle sue librerie, a patto che il software che le usa sia a sua volta GPL. http://www.trolltech.com/download/qt/mac.html Su questo e` necessario installare i bindings per Python: http://www.riverbankcomputing.co.uk/pyqt/index.php Qt si appoggia a Carbon per la visualizzazione, in modo trasparente per lo sviluppatore. Sotto MacOS X e` anche possibile lanciare X11.app. Questa e` una normale applicazione che e` un server X11. E` quindi possibile utilizzarla per utilizzare applicazioni grafiche remote o locali di provenienza *nix. E` possibile usare Tkinter e Qt (anche se a mio avviso in questo caso sono da preferire, se appena possibile, le versioni native). E` soprattutto l'unico modo per utilizzare applicazioni scritte con Gtk e Gtk2. E` anche possibile
Appunti di Python svilupparle, e` in tutto e per tutto un server X11, con le stesse possibilita` di quelli che si trovano in altri *nix. La principale differenza e` che le applicazioni X11 hanno un look and feel piuttosto diverso da quello delle classiche applicazioni MacOS (a partire dal menu dentro le finestre fino ad arrivare al tema... che comunque si puo` aquizzare). Esiste anche un port di Gtk1: http://sourceforge.net/projects/gtk-osx/ tuttavia non sono ben a conoscenza di come proceda lo sviluppo.
Da dove iniziamo
Per prima cosa, si crei una directory chiamata progetti dove metteremo i nostri script python. Prima di iniziare ricordate che: 1. Gli script dovranno avere l'estensione .py 2. L'identazione del codice (spazi tra il bordo sinistro ed i comandi), fa parte della sintassi python. L'identazione DEVE essere fatta con il tasto tab (quel tasto vicino alla 'q', giusto per capirci) Sbagliare l'identazione significa generare errori 3. Le istruzioni python non hanno una punteggiatura che ne indica la fine. 4. Per eseguire il codice python basta scrivere: 5. python nomescript.py (in realt non l'unico modo, ma quello che seguiremo per semplificarci la vita)
E adesso iniziamo!!
Ok, iniziamo con un semplice esempio: 1) Apriamo il nostro editor 2) Creamo un file chiamato test.py sotto la cartella progetti (precedentemente creata) 3) All'interno del file scriviamo: print 'Hello World' 4) Adesso apriamo il terminale 5) Posizioniamoci sotto la cartella progetti e scriviamo: python test.py 6) Verr visualizzata la scritta Hello World L'esempio semplice e il risultato abbastanza scontato: l'istruzione print stampa a video. Adesso proviamo ad aggiungere: print 'Hello World' print Oggi una bella giornata print La somma tra 2+2 : print 2+2
Appunti di Python Se eseguite lo scritp, vi restituir: Hello World Oggi una bella giornata La somma tra 2+2 e: 4 Quindi si conclude che: 1) La print funziona anche con doppi apici 2) La print, se incontra numeri con operazioni matematiche, ne restituisce il risultato 3) Tutto ci che tra apici e doppi apici viene considerato come carattere generico. Avrete notato che 2+2 tra gli apici non ha prodotto il risultato di 4 ma seplicemente la stampa di 2+2.
Le Variabili
Per chi non sa cosa sono le variabili, possiamo dire che una variabile un contenitore in cui noi andiamo a mettere un valore numerico, una serie di caratteri e numeri, un valore boleano ecc... Le variabile possono assumere diversi tipi di valore, per semplicit noi vedremo le stringhe e i numeri (intesi come tipo generale): Stringa (una serie di lettere, numeri, punteggiatura ecc..) Esempi di stringhe: Questa una stringa Questa, anche se contiene il numero 2 comunque una stringa 2+2 ecc.. Le stringhe sono scritte tra singoli apici o doppi apici. Se una stringa inizia con un doppio apice, DEVE finire con un doppio apice e viceversa per il singolo apice ATTENZIONE!! Notare che 2+2 una stringa, ci signifiva che i due numeri non sono considerati numeri ma come se fossero lettere. Quindi 2+2 non ritorna il valore dell'operazione matematica! Numerici (un numero intero o decimale) I numerici si dividono a loro volta, secondo il tipo di valore (intero, doppio, reale ecc..). Cercheremo di vedere solo i pi comuni. Esempi di numerici: 2 1000 2.2 2.00 ecc.. Sui numerici possono essere applicate le comuni operazioni matematiche di: + (somma)
Appunti di Python - (differenza) / (divisione) * (Moltiplicazione) % (Modulo) Si possono anche usare le parentesi tonde per determinare l'ordine di esecuzione dell'operazione. Facciamo qualche esempio per capire la differenza tra numerici e stringhe: print '5+2 =' print 5+2 print (3*4)/2 = print (3*4)/2
Il codice sopra produce: 5+2 = 7 (3*4)/2 = 6 Se non riuscite a capire questi esempi, dovete rileggervi il capitolo sopra, poich significa che non avete capito la differenza tra una stringa ed un numero. Capire questa differenza ESSENZIALE!! Proviamo a variare l'esempio in questo modo: print '5+2 =', print 5+2 print (3*4)/2 =, print (3*4)/2 Sono state aggiunte due virgole alla fine delle stringhe. Il risultato cambia in: 5+2 = 7 (3*4)/2 = 6 Si deduce che la virgola unisce, due stringhe o due risultati di due print. Notare che l'unione con la virgola lascia uno spazio tra le due stringhe. Tornando alle variabili, esse possono essere scritte in con qualsiasi carattere esclusi i numeri se messi come primo carattere. Esempi di variabile sono: Nome='Gianni' Nome1='Gianni' entrambe le variabili sono corrette. Nella variabile Nome ci va il valore stringa 'Gianni', stessa cosa per la variabile Nome1. ATTENZIONE!! Le assegnazioni avvengono sempre da destra a sinistra. Scrivere 'Gianni' = Nome, non corretto!! Adesso passiamo a vedere qualche esempio di variabile: Nome = 'Gianni' Cognome = 'Giusti' Email = '[email protected]' print 'Io mi chiamo ',Nome,Cognome print 'La mia Email :',Email Questo produce: Io mi chiamo Gianni Giusti
Appunti di Python La mia Email : [email protected] poich: viene stampato 'Io mi chiamo ' poi c' una virgola e successivamente la variabile Nome, quindi viene stampato il contenuto di quella variabile. Idem per La variabile Cognome. La virgola unisce due stringhe e inserisce uno spazio tra le due ATTENZIONE!! Scrivere: print 'Io mi chiamo Nome Cognome' sarebbe stato sbagliato perch Nome e Cognome vengono considerate stringhe....provare per credere. P.S. Scrivere il codice sotto corretto: stringa = '2+2 =' numero = 4 print stringa,numero Adesso allenatevi un po' con le variabili e con la print. Magari fate qualche piccolo script che faccia qualche operazione di calcoli di volumi e superfici di figure geometriche (tipo: altezza=10 lunghezza=10, superfice =altezza*lunghezza stampate il risultato). ATTENZIONE!!! Le variabili sono sensibili al maiuscolo/minuscolo, ci significa che scrivere ad esempio: Nome= 'Gianni' print nome Non otterremo la scritta Gianni, ma un errore NameError: name 'nome' is not defined. Questo perch la variabile 'Nome' e la variabile 'nome' non sono la stessa variabile. Quando faccio la print, giustamenete per python, la variabile 'nome' non risulta definita. Quindi, nel caso sopra o cambio Nome in nome o cambio print nome in print Nome. Nota personale Nel mio personale modo di dichiarare le veriabili, in genere uso le maiuscole per le prime lettere che mi identificanio in qualche modo le variabili. Esempio: Se devo creare una variabile contenente il nome ed il cognome di una persona, la chiamer: NomeCognome = 'Gianni' Questo serve solo ad una lettura migliore del codice.
Appunti di Python
Input da tastiera
Fino ad ora tutto ok, ma se volessimo fare un piccolo programma che calcola l'area di un rettangolo con i valori immessi da un utente? In questo caso ci vengono in aiuto dei comandi che 'catturano' i valori immessi tramite tastiera. (questa operazione detta 'input da tastiera', cio, prendere in ingresso i valori digitati dall'utente) L'istruzione che permette di prendere dei valori numerici in input si chiama proprio input. Valore=input('digita un numero') Questo sopra un esempio dell'istruzione input. Essa scrive a video 'digita un numero' e aspetta che l'utente immetta dei valori e prema su enter (invio). Fatto ci assegna il valore immesso alla variabile Valore. Vediamo un esempio: lunghezza = input('Dammi la lunghezza del rettangolo:') larghezza = input('Dammi la larghezza del rettangolo:') area = lunghezza * larghezza print "L'area del rettangolo ",area Eseguite il codice sopra e guardate gli effetti. Facile vero? Eseguite l'esempio sopra ma date in input una stringa, noterete che vi viene restituito un errore, questo perch l'istruzione input si aspetta valori numerici. In realt possibile passare valori stringa alla input, se vengono racchiusi tra apici. Se volete prendere in ingresso valori stringa (alfanumerici), si deve utilizzare l'istruzione raw_input. La sintassi la stessa della input. Prima di procedere vi lascio con un piccolo esercizio da fare: fate un programma che, sapendo le misure (altezza, lunghezza e spessore) di un blocco di marmo, mi determini quante lastre si possono ottenere, dato uno spessore lastra immesso dall'utente. Dovrete inoltre calcolare i metri quadrati totali delle lastre. Esempio: lunghezza blocco = 400 cm altezza blocco = 150 cm larghezza blocco (spessore) = 200 cm spessore lastra = 2 cm quindi.... N lastre = 200/2 Area lastre = NLastre * ( lunghezza * altezza) beh, praticamente vi ho detto tutto..... :-)
Appunti di Python
Appunti di Python tuple, gli elementi che la compongono sono identificati da una chiave. Ogni elemento del dizionario infatti composto da una chiave ed un valore. La chiave serve per il recupero del valore. Vediamo un esempio: agenda = {'nome':'Gianni','cognome':'Giusti','email':'[email protected]'} Notare che i dizionari sono definiti tra le parentesi graffe. Nel nostro esempio, l'istruzione print agenda['nome'] restituisce 'Gianni' Anche per i dizionari, come per le liste, esistono molte funzioni interessanti. Tra le pi importanti: len = ci indica quanti elementi compongono il dizionario esempio: print len(agenda) l'istruzione sopra, nel nostro specifico esempio, restituisce 3 has_key = ci indica se esite una specifica chiave. Restituisce 1 se presente, altrimenti 0 esempio: agenda.has_key('nome') restituisce 1 keys = restituisce una lista contenente i nomi delle chiavi esempio: print agenda.keys() restituisce ['nome','cognome','email'] values = restituisce una lista contenente i valori. Funziona come la keys vista sopra del = elimina una chiave e il suo valore, dal dizionario esempio: del agenda['nome'] Per aggiungere una chiave e il suo valore, ad un dizionario esistente, vedere l'esempio sotto: agenda['paginaweb'] = 'www.paginaweb.gia' l'esempio sopra aggiunge la coppia chiave/valore 'paginaweb':'www.paginaweb.gia' Per concludere vediamo un esempio simpatico. Unendo una lista ed un dizionario, possiamo creare una struttura simile ad una tabella di un database. Ammettiamo che voglio fare una tabella in ram, chiamata agenda, contenente il nome, il cognome e gli indirizzi di amici. Baster fare una lista di dizionari ed il gioco fatto: agenda = [] agenda.append({'nome':'Gianni','cognome':'Giusti','email':'[email protected]'}) agenda.append({'nome':'Comick','cognome':'','email':'[email protected]'}) agenda.append({'nome':'Rossi','cognome':'Bianchi','email':'[email protected]'}) Nell'esempio abbiamo la lista agenda, composta da 3 dizionari. print agenda[0]
Appunti di Python restitituisce il dizionario {'nome':'Gianni','cognome':'Giusti','email':'[email protected]'} Adesso attenzione: print agenda[0]['nome'] restituisce 'Gianni'. Questo perch viene preso il primo elemento della lista agenda, poi, dal dizionario, il valore della chiave 'nome', in questo caso Gianni. p.s. Le parentesi graffe con linux, possono essere fatte con i tasti AltGr+7 e AltGr+0
Istruzioni di base
Istruzione if e while In questa sezione studieremo le istruzioni pi usate, quelle istruzioni che prima o poi tutti utilizzano. Iniziamo con le strutture di controllo. Spesso si ha la necessit di verificare che certe condizioni siamo verificate. Se considerate l'esempio sotto, lunghezza = input('Dammi la lunghezza del rettangolo:') larghezza = input('Dammi la larghezza del rettangolo:') area = lunghezza * larghezza print "L'area del rettangolo ",area noterete che, se l'utente immette numeri negativi, il programma li prende e li elabora, restituendo un risultato negativo. Ovviamente un area negativa non pu esistere, quindi ci servirebbe un istruzione che controlla il risultato.... un qualcosa che possa verificare che la variabile area non sia minore di zero, nel caso lo fosse, dovrebbe avvisare l'utente. Quindi: se l'area < oppure = a zero scrivi attenzione i dati immessi non sono corretti! Listruzione che fa questo si chiama if quindi il codice risulta essere: if area<=0: print Attenzione, i numeri immessi non sono corretti! print Eseguire nuovamente il programma else: print "L'area del rettangolo ",area Analizzando insieme il codice: per prima cosa si scrive l'istruzione if poi la condizione (in questo caso se area minore o uguale a zero). Fatto ci si mette i due punti :, si va a capo e si preme sul tasto tab per spostarci di una tabulazione. Questo spostamento INDISPENSABILE e tutti ci che si trova spostato di una tabulazione, sotto la if, viene eseguita se la condizione vera. Nel nostro caso specifico, se l'area minore o uguale a zero, viene stampato a video: Attenzione, i numeri immessi non sono corretti! Eseguire nuovamente il programma Cio le due print immediatamente sotto. Capite adesso l'importanza della tabulazione. Avete notato che c' anche un istruzione chiamata else. Essa strettamente legata alla if, in italiano potrebbe essere tradotta con altrimenti. Nel nostro caso specifico: se l'area < oppure = a zero scrivi attenzione i dati immessi non sono corretti! altrimenti scrivi "L'area del rettangolo ",area Vediamo ora l'esempio completo:
Appunti di Python lunghezza = input('Dammi la lunghezza del rettangolo:') larghezza = input('Dammi la larghezza del rettangolo:') area = lunghezza * larghezza if area<=0: print Attenzione, i numeri immessi non sono corretti! print Eseguire nuovamente il programma else: provate ad eseguire print "L'area del rettangolo ",area il codice, immettendo valori negativi e positivi in input. Forse alcuni di voi avranno notato che, nel metodo con cui abbiamo risulto il problema dei valori negativi, c' un errore di concetto: l'errore di immissione dati andrebbe segnalato immediatamente dopo l'istruzione input. Questo permetterebbe la correzzione immediata del dato, senza il bisogno di rieseguire il programma. Ci servirebbe un istruzione che permette di fare questa domanda: finch la lunghezza <= a zero, non andare avanti e continua a chiedere i valori Stessa cosa con la larghezza. In questo caso ci viene in aiuto l'istruzione while. La sintassi la seguente: while lunghezza<=0: lunghezza = input('Dammi la lunghezza del rettangolo:') L'istruzione semplice ed intuitiva, essa ripete tutto quello che si trova sotto di essa, spostata di una tabulazione, fin quando non sar soddisfatta la condizione. Nel nostro caso specifico, fin quando la variabile lunghezza non sar minore o uguale a zero, continua a chiedere il valore di lunghezza. Riguardando il nostro codice originale, possiamo variarlo in questo modo: lunghezza = 0 larghezza = 0 while lunghezza<=0: lunghezza = input('Dammi la lunghezza del rettangolo:') while larghezza<=0: larghezza = input('Dammi la larghezza del rettangolo:') area = lunghezza * larghezza print "L'area del rettangolo ",area Adesso vi invito a provare il codice, immettendo valori negativi. La differenza tra l'istruzione if e la while evidente, entrambe verificamo una condizione, ma nel caso della if, al verificarsi o no di essa, il programma procede. Nel caso della while, il codice al suo interno viene eseguito FINO A CHE non si verifica la condizione stessa. Detto questo, modificatemi il programma sopra, in questo modo: voglio che il programma, dopo aver calcolato l'area del rettangolo, chieda se voglio calcolare una nuova area. In caso affermativo, mi deve richiedere le misure, ricalcolare l'area e richiedere se voglio calcolare una nuova area. Tutto questo, fin quando l'utente non risponde N all'ultima domanda (Calcolare una nuova area?). Un piccolo aiuto: attenzione al tipo di instruzione input da usare!!
Appunti di Python Ciclo For Il ciclo for, permette di iterare una lista. In poche parole esso permette l'estrazione di tutti i dati di una lista e l'esecuzione del codice identato sotto di esso. Pi facile vedere un esempio che spiegarlo: giorni = ['Luned','Marted','Mercoled','Gioved','Venerd','Sabato','Domenica'] for giornisettimana in giorni: print giornisettimana il codice sopra stampa a video i nomi dei giorni della settimana. Analizzando il codice notiamo che il comando for ha la seguente sintassi: parola chiave for + nome variabile + parola chiave in + lista da cui estrarre i dati + : Tutto questo pu sembrare un po' strano da chi proviene da altri linguaggi, abituati ad usare il for principalmente per ripetere una parte di codice per n volte. In realt questo si pu fare anche con python, ma non certo questo l'uso principale che ne viene fatto. Esempio di ripetizione del codive per n volte: for variabile in range(5): print 'Gianni' il codice sopra stampa a video Gianni per 5 volte. Un'altro uso che si pu fare del for l'iterazione di un dizionario: db = {'nome':'Gianni','cognome':'Giusti','email':'[email protected]'} for k, v in db.items(): print k,'=',v Dall'esempio sopra stato usato items() che estrare la coppia chiave/valore del dizionario. Il risultato di quel codice : cognome = Giusti email = [email protected] nome = Gianni
Appunti di Python
Funzioni e Moduli
Fino ad ora abbiamo visto i comandi di base che ci permettono di scrivere del codice. Adesso inizieremo a fare programmi un po' pi complessi, quindi avremo bisogno di ampliare le nostre conoscenze. La prima cosa che vedremo sono le funzioni. Le funzioni sono delle porzioni di codice autonomi, atte a svolgere determinati compiti. In ingresso possono prendere dei valori (parametri), elaborarli e restituire un risultato. I vantaggi nell'uso delle funzioni sono molti, tra i quali: permettono il riutilizzo del codice eliminano il codice ridondante il codice viene diviso in blocchi omogenei ecc... Una funzione deve essere scritta con la seguente sintassi: parola chiave def + nome funzione + ( + parametri divisi da virgola + ) + : istruzioni parola chiave return + risultato Esempio: Se volessi creare una funzione che calcola l'area di un rettangolo (giusto per riprendere un vecchio esempio), potrei fare: def AreaRettangolo(lunghezza,larghezza,altezza): area = lunghezza * larghezza * altezza return area adesso, per utilizzare la funzione baster richiamarla con il nome e passare i parametri: altezza = 10 largezza = 5 lunghezza = 15 print 'Il rettangolo ha un area di', AreaRettangolo(lunghezza,largezza,altezza) , 'Metri' bene, adesso provate ad eseguire tutto il codice, il risultato sar la stampa di: Il rettangolo ha un area di 750 Metri Attenzione!! Le variabili usate all'interno della funzione sono dette variabili locali in quanto hanno validit solo all'interno della funzione, ci significa che sono viste solo all'interno della funzione stessa. Nel nostro esempio specifico, la variabile altezza del programma, NON la stessa variabile di altezza usata all'interno della funzione. Per chiarezza del codice, io uso mettere una P prima dei parametri, una F prima delle variabili usate all'interno della funzione. Nel nostro esempio specifico avrei scritto: def AreaRettangolo(Plunghezza,Plarghezza,Paltezza): Farea = Plunghezza * Plarghezza * Paltezza return Farea altezza = 10 largezza = 5 lunghezza = 15 print 'Il rettangolo ha un area di', AreaRettangolo(lunghezza,largezza,altezza) , 'Metri' Questa nomenclatura non obbligatoria solo un mio modo di procedere
Appunti di Python Se si definisce un valore al parametro, il parametro diventa opzionale. Esempio: def AreaRettangolo(Plunghezza,Plarghezza,Paltezza=10): Farea = Plunghezza * Plarghezza * Paltezza return Farea In questo caso Paltezza un parametro opzionale, quindi se non lo passo alla funzione, prende il valore di 10 I Moduli sono file .py che possono essere richiamati da codice python. Avevamo detto all'inizio, che python ha poche istruzioni, (non dovrebbero essere pi di 20). Questo potrebbe far credere che python sia limitato, ma non cos. Si scelto la semplicit, invece di centinaia di istruzioni si scelto poche istruzioni (quindi maggior semplicit). Questo ha fatto nascere una miriade di moduli fatti da terzi, per la gestione delle problematiche pi comuni: accesso a database, gestione dei file, gestione delle date, stringhe ecc.. Questi moduli non sono altro che funzioni richiamabili dai nostri progetti, tramite l'instruzione import nomemodulo. Chiunque pu farsi il proprio modulo ed importarlo nel progetto che vuole. Adesso pensate alle funzioni e ai moduli, se si uniscono le due cose, vi sar sicuramente venuta un idea: allora posso farmi delle funzioni, quelle che pi uso, metterle in un modulo e usarle su tutti i progetti che voglio senza riscriverle......ebbene s. Io mi sono fatto un modulo chiamato utility.py in cui inserisco le funzioni generali dei miei progetti. Tornando al nostro esempio, possiamo mettere la funzione: def AreaRettangolo(Plunghezza,Plarghezza,Paltezza): Farea = Plunghezza * Plarghezza * Paltezza return Farea in un file chiamato aree.py poi nel nostro progetto, chiamato ad esempio lezione.py potremmo scrivere: import aree altezza = 10 largezza = 5 lunghezza = 15 print 'Il rettangolo ha un area di', aree.AreaRettangolo(lunghezza,largezza,altezza) , 'Metri' Notare: import aree = importa il modulo aree.py l'estensione NON serve scriverla aree.AreaRettangolo(lunghezza,largezza,altezza) = per richiamare una funzione del file aree, si deve specificare il nome del modulo + la funzione da chiamare. (per chi ha gi programmato con linguaggi ad oggetti, avr gi capito il perch si utilizza questa sintassi).
Appunti di Python
Appunti di Python richiesta, in un file di testo chiamato agenda.txt. Divideremo il progetto in due moduli: FunzioniAgenda.py, contenente tutte le funzioni generiche di gestione dell'agenda (inserimento, ricerca, cancellazione) GuiAgendaTerminale.py, contenente le istruzioni di input e output sul terminale. Agendo in questo modo, in futuro, quando faremo l'interfaccia grafica su gnome, genereremo semplicemente un nuovo modulo chiamato GuiAgendaGTK.py e RIUTILIZZEREMO, senza nessuna modifica, il modulo FunzioniAgenda.py. In parole povere, dividiamo il motore vero e proprio della gestione dell'agenda (FunzioniAgenda.py), dalla sua rappresentazione grafica (GuiAgendaTerminale.py e GuiAgendaGTK.py). Ho evidenziato la voce RIUTILIZZEREMO perch questo un concetto che dovete aver ben chiaro: qualsiasi cosa fate, cercate di farla in modo che possa essere riutilizzata. Per far questo si devono sempre usare funzioni e moduli, ben studiati. Di seguito, vedremo le funzioni per inserimento, ricerca e cancellazione dell'agenda. Iniziamo dall' inserimento. Per prima cosa si deve aver ben chiaro quali sono i dati importanti, coinvolti durante l'inserimento e come deve avvenire. Ci sono 2 dati importanti nell'inserimento: il nome e il numero telefonico. Questi dati, abbiamo detto che saranno memorizzati in un dizionario, la cui chiave sar il nome il cui valore sar il numero telefonico. Quindi, la nostra funzione dovr prendere in ingresso il nome del dizionario a cui aggiungere i dati, il nome e il telefono. I nomi delle funzioni, devono essere rappresentative di ci che fanno, quindi ho pensato di chiamare AggiungiNumero, la nostra funzione (notare che i nomi delle funzioni sono scritte SENZA spazi). Ok, adesso iniziamo a scrivere: def AggiungiNumero(Agenda,Nome,Telefono): Questa la prima riga della funzione AggiungiNumero. Vediamola nel dettaglio: il comando def (come abbiamo gi visto), serve a definire una funzione AggiungiNumero il nome che noi abbiamo dato alla funzione Quello che sta tra parentesi tonde, sono i parametri (i dati che noi daremo in pasto alla funzione) Il parametro Agenda la lista che gli passeremo (la lista contiene tutta l'agenda), Nome il nome e Telefono il numero telefonico da inserire. I due punti finali, sono obbligatori e fanno parte della sintassi delle funzioni (e non solo) Adesso scriviamo il resto: def AggiungiNumero(Agenda,Nome,Telefono): Agenda[Nome] = Telefono Ok, ma come funziona? Semplice, vengono passati 3 valori. Agenda il nome della lista che contiene la lista di tutti i nomi e i numeri telefonici, Nome contiene il nome della persona che vogliamo inserire nell'agenda, Telefono contiene il numero telefonico che voglio inserire, associato al nome. L'istruzione Agenda[Nome] = Telefono non fa altro che aggiungere al dizionario, la chiave Nome ed il valore Telefono. Vediamo un esempio:
Appunti di Python def AggiungiNumero(Agenda,Nome,Telefono): Agenda[Nome] = Telefono Agenda = {} nomedainserire = 'Gianni' telefonodainserire = '1234567890' AggiungiNumero(Agenda,nomedainserire,telefonodainserire) L'esempio sopra funziona in questo modo: Nelle prime due righe viene definita la funzione (e questo lo abbiamo gi spiegato) Poi viene definito il dizionario vuoto, chiamato Agenda (tramite Agenda = {}) Successivamente, vengono definite due variabili stringa: nomedainserire il cui valore 'Gianni' e telefonodainserire il cui valore '1234567890'. A questo punto viene richiamata la funzione, passando i valori nomedainserire e telefonodainserire, quindi (se torniamo a vedere la definizione della funzione AggiungiNumero), di fatto, i valori dei parametri della funzione (Nome e Telefono), diventano rispettivamente, 'Gianni' e '1234567890'. Adesso viene eseguita l'istruzione Agenda[Nome] = Telefono, che si trova all'interno della funzione. Questa istruzione, viene 'tradotta' dal programma in questo modo: Agenda['Gianni'] = '1234567890', questo perch Nome = 'Gianni' e Telefono = '098078897'. Quindi il programma aggiunge la chiave 'Gianni' al dizionario Agenda, ed associa alla chiave 'Gianni', il valore '1234567890'. Questa parte sopra molto importante capirla bene, quindi vi consiglio di leggerle pi volte fin quando non vi tutto chiaro. Procedura di Cancellazione Fatta la funzione di inserimento, procediamo col fare la procedura di cancellazione. Per cancellare i dati (nome e numero), sufficiente avere il nome (in quanto non gestiamo le omonimie). Quindi dovremo fare una funzione che, passando il dizionario ed il valore della chiave 'Nome', provveda a cancellare il nome ed il numero telefonico. La procedura semplice: def CancellaNumero(agenda,Nome): if agenda.has_key(Nome): del agenda[Nome] Questa funzione usa l'istruzione has_key. Essa verifica se la chiave esiste, in caso affermativo cancella la chiave ed il valore, altrimenti avvisa l'utente che il nome non presente nell'agenda. Se, ad esempio, si vuol cancellare il nome 'Gianni' dal dizionario agenda, scriveremo; CancellaNumero(Agenda,'Gianni') La funzione sopra, prender come valore del parametro Nome, il valore 'Gianni'. Successivamente verifica se nel dizionario agenda presente la chiave 'Gianni': if agenda.has_key('Gianni'):. In caso affermativo, cancella la chiave ed il suo valore: del agenda['Gianni'] Procedura di Ricerca La ricerca , in qualche modo, simile alla cancellazione. Anche in questo caso, dovremmo passare come parametri: il nome del dizionario e il nome della chiave che si vuol cancellare. def CercaNumero(agenda,Nome): if agenda.has_key(Nome):
Appunti di Python return "Numero Telefonico "+ agenda[Nome] Non difficile capire che cosa fa la funzione.... 1) verifica se c' la chiave 2) Se presente restituisce la stringa contenente il numero telefonico Funzione per visualizzare l'intera Agenda Per fare questa funzione, sar necessario passare alla funzione, unicamente il dizionario. Successivamente dovremmo scorrere le chiavi del dizionario e stamparne il nome ed il valore. In pratica: def MostraAgenda(agenda): print "Agenda Telefonica:" for x in agenda.keys(): print "Nome: ",x," \tTelefono: ",agenda[x] print La funzione inizia con la stampa a video della scritta Agenda Telefonica. Successivamente, con l'istruzione for x in agenda.keys(): , scorre e preleva tutte le chiavi del dizionario. Per ogni chiave ne stampa il valore corrispondente (agenda[x]). Alcuni di voi avranno notato uno strano carattere (\t), nell' istruzione: print "Nome: ",x," \tTelefono: ",agenda[x] esso serve a stampare una tabulazione. In pratica, l'istruzione sopra stampa: Nome: + chiave + tabulazione + Telefono + valore della chiave Esempio: Nome: Gianni Telefono: 098078897 Funzione per il salvataggio dei valori su un file Questa gi una funzione pi complessa. Per prima cosa, dobbiamo decidere in che modo (in quale formato), vogliamo salvare i nostri dati. La cosa pi semplice da fare, il salvataggio con il separatore di campo. Che cosa significa salvare dei dati con un separatore di campo? Semplicemente andremo a scrivere in un file i nostri dati (nome e numero telefonico), separati da un carattere a nostra scelta. In genere, quando si eseguono salvataggi di questo genere, come separatore di campo viene scelto un carattere non usato nei dati: assurdo, ad esempio, scegliere come separatore una lettera, poich creerebbe confusione e, in molte situazioni, non si riuscirebbe pi a capire, dove finisce il campo stesso. Normalmente, come separatore, viene usato un carattere di punteggiatura (o la virgola o il punto e virgola ecc..). Qualcuno di voi, potrebbe obbiettare che anche questo pu generare confusione nei casi in cui, la punteggiatura presente anche nel campo. In casi come questi, si usa mettere i campi tra i doppi apici. Nel nostro caso specifico, siamo di fronte a nomi e numeri telefonici. In entrambi i casi, il punto e virgola non sar mai presente in nessuno dei due campi, quindi lo useremo come separatore di campo. Il formato del nostro file, sar: Nome;Telefono + ritorno a capo Nome;Telefono + ritorno a capo ecc... Spiegato pi dettagliatamente, abbiamo scelto (per convenzione nostra), di salvare i dati seguendo la seguente sintassi:
Appunti di Python Nome + separatore (nel nostro caso il punto e virgola) + Numero telefonico + ritorno a capo Nella funzione precedente, avevamo visto com' possibile stampare una tabulazione. Nello stesso modo, per tornate a capo in un file si deve stampare un carattere particolare: \n Quindi, per la precisione, nel nostro file dovremmo scrivere: Nome + punto e virgola + Telefono + \n Nome + punto e virgola + Telefono + \n ecc... Vedendo un esempio concreto, nel nostro file ci potrebbero essere dati di questo genere: Gianni;12345678\n Panther;7654321\n ....e via dicendo per ogni nome registrato in agenda. Iniziamo a creare la nostra funzione di salvataggio dati. Per prima cosa scegliamo un nome adatto: quale miglio nome di SalvaAgenda? Adesso pensiamo ai parametri da passarealla funzione. Sicuramente dovremmo passare tutti i dati, quindi, nel nostro caso, potremmo passare l'intero dizionario. Altro parametro importante e indispensabile il nome del file in cui vogliamo salvare i dati. Quindi: def SalvaAgenda(agenda,NomeFile): ....e la nostra funzione definita. La prima cosa che dovremmo fare nella funzione aprire il file in cui scrivere i dati. Se vi ricordate bene, per aprire un file sono necessarie due cose: 1) Includere il modulo sys, quindi, nel nostro script, dovremmo scrivere import sys all'inizio 2) dovremmo usare la funzione open per aprire il file Quindi: out_file = open(NomeFile,"w") L'istruzione sopra (come abbiamo gi visto), apre un file, il cui nome contenuto nella variabile NomeFile, in modalit di scrittura (w) e ci riferiremo al file stesso, tramite out_file (quindi le istruzioni di scrittura riguardanti quel file, dovranno essere scritte in questo modo: out_file.write ecc..) Adesso abbiamo aperto il file in scrittura. Prossimo passo la scrittura dei dati. I nostri dati sono contenuti in un dizionario. Abbiamo detto che i dizionari sono una speciale lista contenente la chiave ed il suo valore. Se noi estraiamo le chiavi, saremmo anche in grado di avere il valore corrispondente. Se usiamo l'istruzione for abbinata alla funzione keys dei dizionari, riusciremmo ad estrarre tutte le chiavi. Ad ogni chiave estratta, saremo in grado di estrarre il valore dal dizionario Agenda, riferendoci alla chiave (es:agenda['Gianni']). Quindi: for x in agenda.keys(): out_file.write(x+","+agenda[x]+"\n") Proviamo a tradurre in linguaggio umano, le istrizioni sopra: Linguaggio Python --> For x in agenda.keys() Traduzione Italiano -> Per ogni valore di x tra le chiavi dell'agenda Per ogni chiave dell'agenda trovata, la variabile x diventa uguale al nome della chiave. L'istruzione successiva potrebbe essere tradotta in questo modo:
Appunti di Python Linguaggio Python --> Traduzione Italiano -> out_file.write Scrivi nel file (x+";"+agenda[x]+"\n") Il nome della chiave (x), poi aggiungi il punto e virgola, poi aggiungi il valore del dizionario agenda, la cui chiave x, poi vai a capo (\n)
Il giochetto della traduzione mi servito a farvi capire due cose: 1) Python usa delle istruzioni semplici e chiare 2) Cercate sempre di capire cosa fa il codice. All'inizio difficile, ma poi riuscirete a capire esattamente come funzionano le varie istruzioni ed imparerete a leggere il codice. Estratti tutti i dati dal dizionario, ci resta solo una cosa da fare: chiudere il file stesso. Quindi: out_file.close() Adesso vediamo l'intera funzione di scrittura su file dei dati: def SalvaAgenda(agenda,NomeFile): out_file = open(NomeFile,"w") for x in agenda.keys(): out_file.write(x+","+agenda[x]+"\n") out_file.close() Funzione per caricamento dei valori dal file Se vogliamo caricare la nostra agenda, dovremmo: 1) Aprire il file contenente l'agenda 2) Leggere una riga 3) leggere la chiave ed il valore (es:Gianni,12345) 4) Creare una nuova chiave sul dizionario ed assegnargli il rispettivo valore (es: agenda['Gianni']='12345') 5) Ripetere tutto dal punto 2, fin quando non finito il file Adesso partiamo in modo traumatico :-) Scriver prima la funzione che fa il tutto e successivamente la spiegheremo. La funzione che legge i dati la seguente: def CaricaAgenda(agenda,NomeFile): in_file = open(NomeFile,"r") while 1: in_line = in_file.readline() if in_line == "": break in_line = in_line[:-1] [Nome,Telefono] = string.split(in_line,";") agenda[Nome] = Telefono in_file.close() Indubbiamente, in questa funzione, ci sono parecchie novit che meritano di essere spiegate in modo dettagliato. La cosa che vi sar sicuramente balzata agli occhi, un uso strano dell'istruzione while. Se vi
Appunti di Python ricordate, l'istruzione while, ripete una porzione di codice fin quando la condizione avverata. Esempio: while lunghezza<=0: significa, ripeti il codice fin quando la lunghezza minore o uguale a zero. Nel nostro caso abbiamo scritto: while 1: qualcuno si sar chiesto: ma la condizione dov'? In realt quel while ha una condizione che sempre vera, quindi il codice sottostante sar sempre eseguito. Questo tipo di ripetizione infinita detto loop infinito. Nella realt, quello non proprio infinito, in quanto viene interrotto, ad un certo punto, da un istruzione break (guardate qualche riga sotto). Quindi ne deduciamo che possibile uscire da un loop tramite l'istruzione break che lo spezza. Altra strana istruzione questa: in_line = in_line[:-1] Il suo significato semplice: assegna alla variabile in_line, il suo stesso valore meno l'ultimo carattere. Nel dettaglio, l'istruzione in_line[:-1] significa tutti i caratteri dal primo al penultimo. Se avessi scritto in_line[2:5] sarebbe significato tutti i caratteri dal secondo al quinto. Per capire meglio, guardate gli esempi sotto:
s = "Pinco Pallino" print s[:3] scrive 'Pin' print s[3:] scrive 'co Pallino' print s[:] scrive 'Pinco Pallino' print s[2:-2] scrive 'nco Palli'
Tornando al nostro programma, l'istruzione in_line = in_line[:-1], di fatto elimina l'ultimo carattere. Vi chiederete perch? Semplice, se vediamo il nostro formato:
nome+;+telefono+\n
risulta chiaro che il ritorno a capo (\n) ci serviva nel file, ma non lo vogliamo stampare, quindi lo eliminiamo. E adesso vediamo l'ultima istruzione nuova: [Nome,Telefono] = string.split(in_line,";") Sembra complicata, ma il suo significato semplice: la string.split una funzione che ci permette di catturare delle porzioni di stringhe, separate da un carattere a nostra scelta. Nel dettaglio: string.split(in_line,";") significa taglia la stringa nei punti separati dal punto e virgola e dammi i valori stringa. Se torniamo a vedere il nostro formato (senza il ritorno a capo): nome+;+telefono, avrete gi notato che noi abbiamo bisogno di estrarre il nome e il telefono. I due valori (per convenzione nostra), sono separati da un punto e virgola. La funzione string.split(in_line,";") fa proprio ci che serve a noi. La sintassi la seguente: string.split(variabile_contenente_i_valori,"carattere_separatore_di_testo"), nel nostro caso specifico: string.split(in_line,";") La sintassi [Nome,Telefono] = string.split(in_line,";") significa: dopo aver estratto i valori di nome e cognome, assegnali alle variabili Nome e Cognome.
Appunti di Python ATTENZIONE!! L'istruzione string.split, fa parte di una serie di funzioni dedicate alle stringhe. Per usare queste funzioni necessario inserire import string all'inizio dello script Spero che la spiegazione all'intera funzione, non vi abbia demolito :-) Facciamo un riassunto: def CaricaAgenda(agenda,NomeFile): in_file = open(NomeFile,"r") while 1: in_line = in_file.readline() -> definisco la funzione ed i suoi parametri -> apro il file contenente l'agenda in lettura -> creo un loop, finquando ci sono dati da leggere -> leggo una linea del file e assegno il contenuto alla variabile in_line if in_line == "": -> controllo se la variabile in_line vuota, allora il file stato letto tutto break -> se la condizione sopra vera esci dal loop in_line = in_line[:-1] -> elimina dalla stringa, il ritorno a capo (\n) [Nome,Telefono] = string.split(in_line,";") -> leggi i dati nome e telefono ed assegna i valori alle variabili Nome e Telefono agenda[Nome] = Telefono -> inserisci la chiave ed il valore nel dizionario in_file.close() -> Chiudi il file
Bene, studiatevi bene le linee sopra e cercate di capire il significato di ogni linea. Adesso non ci rimane che due cose da fare: 1. Creare un po' di codice che utilizzi le funzioni 2. Creare una sorta di men che indichi all'utente, le azioni che pu fare. Il men, possiamo farlo, creando una semplice funzione che stampi a video le possibili azioni che l'utente pu fare. Non vi star a spiegare nel dettaglio la funzione, ve la propongo sotto, ma chiaro ci che fa: def print_menu(): print '----------- AGENDA -------------' print '1. Mostra Agenda' print '2. Aggiungi un nuovo numero' print '3. Cancella un numero telefonico' print '4. Cerca un numero telefonico' print '5. Carica Agenda' print '6. Salva Agenda' print '7. Esci' print '--------------------------------' Adesso uniamo il tutto con il vero e proprio programma: Il nostro scopo quello di permettere di eseguire delle azioni, alla pressione di certi tasti. Esempio: se l'utente preme su 1, dovr essere mostrata l'agenda, se preme su 2, dovr esser aggiunto un nuovo numero e via dicendo. Le azioni saranno inserite tramite l'istruzione input.
Appunti di Python Con degli if, andremo a controllare ci che l'utente ha premuto, e, secondo le scelte fatte, saranno intraprese delle azioni e richiamate delle funzioni. Nel codice useremo l'istruzione elif essa utilizzata in abbinamento ad if, in Italiano, potrebbe essere tradotta in altrimenti se. L'istruzione if unita ad elif, permette di creare delle scelte annidiate.... strutture particolari che svolgono azioni tipo: se a uguale a b fai questo altrimenti se a uguale a c fai questo altrimenti se a uguale a d fai questo .....e cos via Ricordate una cosa, i confronti si scrivono in questo modo: in Italiano se a uguale a b con python if a==b (notare i due uguali!!) in Italiano se a maggiore di b con python if a>b in Italiano se a minore di b con python if a<b in Italiano se a maggiore o uguale a b con python if a=>b in Italiano se a diverso da b con python if a!=b Adesso avete tutto il necessario per capire come funziona l'intero programma, quindi vi scrivo sotto l'intero script, ve lo guardate, lo provate e cercate di capire come funziona. Soprattuto il codice finale che non vi ho spiegato nel dettaglio, ma che dovreste essere in grado di capire, con un po' di sforzo, come funziona. Il consiglio che vi do quello di stamparvi il codice, eseguire il programma e studiare sul codice come funziona al verificarsi delle scelte dell'utente. Nella prossima puntata inizieremo ad usare Glade, successivamente separeremo il codice dell'agenda dalla sua rappresentazione visiva e creeremo il programma per glade. Buon lavoro e buon studio. Codice completo (salvate con il nome di agenda.py ed eseguitelo con l'istruzione python agenda.py). ATTENZIONE!!! E' possibile che le tabulazioni vadano riscritte altrimenti python si arrabbia: import sys import string def MostraAgenda(agenda): print "Agenda Telefonica:" for x in agenda.keys(): print "Nome: ",x," \tTelefono: ",agenda[x] print def AggiungiNumero(agenda,Nome,Telefono): agenda[Nome] = Telefono def CercaNumero(agenda,Nome): if agenda.has_key(Nome): return "Numero Telefonico "+agenda[Nome] else: return Nome+" non trovato"
Appunti di Python def CancellaNumero(agenda,Nome): if agenda.has_key(Nome): del agenda[Nome] else: print Nome," non trovato" def CaricaAgenda(agenda,NomeFile): in_file = open(NomeFile,"r") while 1: in_line = in_file.readline() if in_line == "": break in_line = in_line[:-1] [Nome,Telefono] = string.split(in_line,";") agenda[Nome] = Telefono in_file.close() def SalvaAgenda(agenda,NomeFile): out_file = open(NomeFile,"w") for x in agenda.keys(): out_file.write(x+";"+agenda[x]+"\n") out_file.close() def print_menu(): print '----------- AGENDA -------------' print '1. Mostra Agenda' print '2. Aggiungi un nuovo numero' print '3. Cancella un numero telefonico' print '4. Cerca un numero telefonico' print '5. Carica Agenda' print '6. Salva Agenda' print '7. Esci' print '--------------------------------' DizionarioNumeri = {} SceltaMenu = 0 print_menu() while SceltaMenu != 7: SceltaMenu = input("Menu (1-7):") if SceltaMenu == 1: MostraAgenda(DizionarioNumeri) elif SceltaMenu == 2: print "Aggiungi un nome e il numero telefonico" Nome = raw_input("Nome:")
Appunti di Python phone = raw_input("Telefono:") AggiungiNumero(DizionarioNumeri,Nome,phone) elif SceltaMenu == 3: print "Rimuovi il Nome e il relativo telefono" Nome = raw_input("Nome:") CancellaNumero(DizionarioNumeri,Nome) elif SceltaMenu == 4: print "Ricerca il numero telefonico" Nome = raw_input("Nome:") print CercaNumero(DizionarioNumeri,Nome) elif SceltaMenu == 5: NomeFile = raw_input("Nome del file da caricare:") CaricaAgenda(DizionarioNumeri,NomeFile) elif SceltaMenu == 6: NomeFile = raw_input("Nome del file da salvare:") SalvaAgenda(DizionarioNumeri,NomeFile) elif SceltaMenu == 7: pass else: print_menu()
Appunti di Python
Appunti di Python
Finestra Glade
La finestra Glade la finestra principale del programma, se si chiude, si chiude il programma stesso. Essa si presenta come nella figura sotto (ovviamente i pulsanti possono variare secondo il tema di Gnome usato):
La finestra divisa in 4 parti: 1. Barra dei menu (quella in alto dove c' scritto Project, Modifica, Visualizza ecc...) 2. Barra degli strumenti (Nuovo, Apri, Salva ecc...) 3. Un riquadro bianco (il cui utilizzo lo vedremo in seguito) 4. Una Barra di stato (quella in cui scritto Nuovo progetto creato.), in cui vengono stampati messaggi e avvisi Adesso spiegheremo che cose significano alcuni men. ATTENZIONE!!! NON premete su i pulsanti che spiegheremo ora: per il momento limitatevi a seguite il testo, successivamente inizieremo ad usare Glade e ci che si spiegato Con il pulsante Nuovo (oppure dal men Project/Nuovo) possibile creare un nuovo progetto. Per progetto si intende una o pi finestre e i suoi componenti (pulsanti, etichette(label), caselle di inserimento testo ecc...). Tornando all'esempio della nostra agenda, il progetto, potrebbe essere composto da una finestra al cui interno c' una casella testo per le ricerche, un pulsante ed una griglia che mostra tutta l'agenda. Il pulsante Apri (oppure il men Project/Apri), ci permette di aprire un progetto precedentemente salvato. Il pulsante salva (oppure il men Project/Salva), ci permette di salvare un progetto, come abbiamo visto in precedenza, in xml
Appunti di Python Il pulsante opzioni (oppure il men Project/Options...), ci permette di impostare le opzioni per il nostro specifico progetto Il pulsante Crea eseguibile, non lo utilizzeremo mai poich specifico per il linguaggio C e non serve nel caso di python Nella barra dei men presente Modifica, esso il classico men in cui sono presenti i comandi di copia, incolla, taglia e delete (elimina). E' interessante vedere il men Visualizza. Esso ci permette di scegliere gli strumenti che vogliamo visualizzare in glade, se lo aprite, noterete due caselle spuntate: Mostra Paletta e Mostra editor delle propriet. Provate a deselezionare le voci per capire a che servono, poi rimetteteli come sono in modo da avere l'ambiente Glade uguale al mio e procedere insieme di pari passo. Il men Impostazioni, ci permette di impostare il nostro editor. Lo vedremo meglio nel dettaglio in seguito, sarebbe inutile spiegarlo ora Per ultimo abbiamo un men Aiuto... facile intuire che questo men contiene la guida a glade Finestra Paletta All'apertura di Glade, si sono aperte anche altre due finestre, una di queste la finestra Paletta (vedi figura sotto). Come potete vedere, essa divisa in tre parti: Nella parte alta, c' un pulsante Selettore, esso ci permette di passare in modalit selezione (capirete meglio in seguito che significa) Poi abbiamo 4 pulsanti: GTK+ Basic, GTK+ Additional, Gnome e Deprecated (nella figura ne sono presenti solo 3) Nella parte bassa, abbiamo tutta una serie di icone. Ogni icona rappresenta un tipo di controllo che si pu aggiungere nella finestra. Esempio: l'icona rettangolare in cui scritto ab| (la seconda della seconda riga), ci permette di creare un campo di immissione nella finestra. Come si pu vedere dalla figura, in questo specifico caso attivato il pulsante GTK+ Basic, quindi vengono mostrati tutti i controlli di base della libreria GTK.....in parole povere le icone relative ai controlli inseribili nella finestra (parte bassa della figura), sono quelli di base (Basic appunto). Se premo su GTK+Additional, vengono mostrati i controlli addizionali, utilizzabili nelle finestre, stessa cosa per il pulsante gnome e deprecated. Nel nostro caso specifico, abbiamo bisogno di compatibilit con windows, quindi eviteremo di usare controlli specifici di Gnome (pulsante Gnome) e controlli strani per l'ambiente windows (GTK+ Additional). I controlli Deprecated, non li utilizzeremo perch, sotto questa voce, vengono inseriti controlli considerati vecchi. Ebbene s, nelle nostre lezioni utilizzeremo solo controlli presenti sotto GTK+Basic. Comunque questi controlli sono pi che sufficienti a creare tutte le applicazioni che desideriamo.
Appunti di Python Finestra Propriet Adesso vediamo l'ultima finestra che abbiamo nel video, la finestra Propriet, visibile in figura sotto. Chi stato attento, avr gi intuito a cosa serve questa finestra. Essa ci permette di impostare le propriet di ogni singolo componente della finestra del progetto e delle finestre stesse del progetto. Ricordiamo che ogni componente ha delle propriet (es: lunghezza, altezza, bordo ecc...). Esso ha anche una sezione chiamata Segnali che molto molto importante, direi che il motore indispensabile al funzionamento del programma vero e proprio. In seguito vedremo meglio di che cosa si tratta.
Primo problema: che cosa si deve scegliere? La risposta semplice, noi vogliamo creare un progetto funzionante con le librerie GTK+, sia su Gnome che su windows, quindi premiamo sul pulsante New GTK+ Project, per creare un programma generico, funzionante con le librerie GTK+. Adesso creiamo la finestra in cui inseriremo il pulsante: dalla finestra Paletta, premere sul pulsante GTK+ Basic, poi sulla prima icona dei componenti (la prima icona in alto a destra, quella sopra l'icona A, giusto per essere chiari). Se ci andate sopra, vi verr mostrata la guida con la scritta Finestra.
Appunti di Python
Appena avete premuto sull' icona Finestra, verr mostrata una finestra come quella sotto:
Quella sar la finestra del nostro progetto, quella in cui andremo a disegnare i pulsanti, le etichette ecc... ATTENZIONE!! Da adesso in avanti, chiameremo, le icone sulla finestra Paletta, con il nome di Componenti o widget. Quindi ci che abbiamo fatto ora, stato quello di premere sul componente (o widget) Finestra del gruppo GTK+ Basic Notiamo subito alcuni particolari: La finestra Glade cambiata in questo modo:
In quella che prima era un area bianca, adesso c' la scritta window1. In quest'area verranno elencate tutte le finestre del progetto. E' utile per passare da una finestra all'altra del progetto in fase di disegno, nel caso il nostro programma fosse composto da pi finestre. Adesso fate un click proprio in quest'area, in corrispondenza della scritta window1 o della sua icona. Guardiamo la finestra Propriet com' cambiata. Dovrebbe essere grosso modo come quella sotto:
Appunti di Python Il titolo della finestra a fianco dice Propriet: window1, infatti quelle che vedete sono le propriet della finestra che avete creato. Cerchiamo di capire che cosa sono queste propriet nel dettaglio (vedremo solo le propriet pi usate) Nome -> il nome della finestra (da non confondere con il titolo!!). E' il nome di riferimento che verr usato da python per riferirsi a quella finestra. Class -> difficile spiegarvi che cosa significa Class, se non avete concetti di programmazione ad oggetti. Per farvela breve, diciamo che Class ci indica a che gruppo di componenti appartiene. Tutti i componenti che appartengono allo stesso gruppo, anche se hanno nomi diversi, hanno propriet identiche. Se create una nuova finestra, essa apparterr sempre alla stessa Classe. In seguito, vedremo che ci che c' scritto nella casella Class, potr essere utile. NON VARIATE CIO' CHE C'E' SCRITTO!! Spessore Bordo -> lo spazio, in pixel, che intercorre tra il bordo ed i componenti (provate ad aumentarlo e guardate come varia la finestra, poi riportatelo su zero) Titolo -> E' il titolo che compare sulla finestra, cambiamolo e scriviamo La mia Prima Finestra. Notate ci che succede alla finestra Posizione -> Indica in che posizione si deve trovare quando viene visualizzata per la prima volta (all'avvio del programma). Cambiamo il valore e scegliamo Center. L'effetto non lo vedete subito, ma durante l'esecuzione del programma python che la richiama. Resizable -> Indica se vogliamo che la finestra possa essere ridimensionata dall'utente. Lasciamo S. Icona -> Indica l'icona da associare alla finestra. Lasciamo vuoto Adesso provate a passare sulla scritta Nome, Class, Titolo ecc... soffermandovi qualche secondo su ogni scritta. Noterete che vi viene restituito un suggerimento che vi aiuta a capire che cosa significa quella propriet.
Appunti di Python Larghezza -> Indica la larghezza minima della finestra. Nel caso la finestra sia ridimensionabile, quello il limite minimo relativo alla larghezza. Nel nostro caso disattivato, quindi non esiste una larghezza minima. Altezza -> Come sopra ma relativo all'altezza Visibile -> Indica se la finestra dovr essere visibile all' esecuzione del programma. Pu sembrare una propriet strana, ma molto utile su progetti con pi finestre (con l'esperienza poi capirete perch) Suggerimento -> il suggerimento che volete mostrare, quando l'utente passa sulla finestra.
Dopo questa breve e noiosa lezione, passiamo a spiegare come inserire dei componenti della finestra. Per inserire i componenti, dobbiamo anche capire di cosa abbiamo bisogno. NON possibile (o per lo meno NON corretto), inserire i componenti direttamente sulla finestra, poich la finestra accetta un solo componente (widget). Quindi, prima di tutto, dovremmo inserire uno o pi speciali pannelli chiamati sizers, adibiti al posizionamento dei componenti. Attraverso i sizers possibile creare una struttura simile a tabelle, in cui, ogni singola cella, pu ospitare un solo widget (componente). E' buona norma pensare precedentemente a come deve essere la nostra interfaccia, questo permette una facile scelta dei sizer da utilizzare. Quando realizzate un nuovo programma, prima di disegnare la finestra o le finestre che lo compongono, buona norma disegnarle su un foglio, o meglio ancora attraverso dei programmi. Non importante disegnare il dettaglio della finestra, ma un prototipo, in modo da aver chiaro che cosa si vuol ottenere in fase di disegno con glade.
Appunti di Python I sizers che possiamo utilizzare sono quelli indicati dalle freccie
Ogni uno ha le proprie caratteristiche, i pi eleganti sono i primi 3 (per tutta una serie di ragioni che non vi star a dire), ma l'ultimo (Posizione Fissa) il pi semplice da usare. Esso supporta pi componenti su di esso, ed un posizionamento tramite il trascinamento del componente stesso. Quindi useremo proprio quel componente. Prima di procedere, guardate la finestra, il suo interno composto da righe oblique incrociate.
Premete sul componente Posizione Fissa, poi fate un click all'interno della finestra e notate com' variata: Adesso al suo interno compaiono una serie di puntini, quelli sono la nostra guida per posizionare gli oggetti. Andate sul Menu Impostazioni della finestra Glade e vediamo i men che ci vengono proposti: Mostra Griglia -> permette di attivare e disattivare la griglia (provate a farlo e guardate che succede) Snap to Griglia -> Significa se vogliamo che i componenti inseriti si spostino solo sui punti Impostazioni Opzioni Griglia -> Indica quanto fitta dev'essere la griglia Adesso prendiamo un componente e posizioniamolo sulla finestra: 1. Premete sul componente Pulsante (Il primo della terza riga, quello con scritto OK) 2. Spostatevi su un punto all'interno della finestra e premete sul pulsante sinistro del mouse
Appunti di Python Ci che otterrete questo: La vostra prima finestra con un pulsante. Adesso premete sul pulsante ed andate a vedere le propriet di esso. Noterete che alcune propriet sono uguali a quelle della finestra, mentre altre sono differenti o nuove. Da ci si deduce che le propriet variano da componente a componente.
Adesso andate sul menu Visualizza e premete su Mostra albero dei widget. Apparir una finestra come questa: Questa vi visualizza la lista dei componenti (widget) usati e la loro gerarchia, vi permette inoltre, di selezionarli in modo rapido. Nel nostro caso, vediamo che abbiamo una finestra chiamata window1, all'interno di essa c' un pannello fixed1, sul quale presente un bottone button1. Adesso provate a cliccare su ogni singolo componente e guardate che succede. Notate che alla selezione di un componente, corrisponde la visualizzazione delle sue propriet e la selezione nella finestra. Avrete senza ombra di dubbio capito l'utilit di questa finestra. Soprattutto se ci sono molti componenti e finestre che compongono il progetto. Se vogliamo cancellare un componente inserito, basta selezionarlo e premere sul tasto Canc o Del. Proviamolo subito cancellando il pulsante. Lo scopo del nostro programma quello di gestire la nostra agenda. Quindi dovremmo inserire almeno tre pulsanti per gestire la ricerca, l'inserimento e l'eliminazione di nomi e telefoni. Esistono due componenti che ci aiuta a gestire gruppi di pulsanti, uno per pulsanti disposti in orizzontale e uno per gruppi di pulsanti verticali. Essi sono molto comodi perch raggruppano i pulsanti ad intervalli regolari e li allineano. Noi utilizzeremo pulsanti orizzontali.
Appunti di Python
Premiamo sul componente per gruppi pulsanti orizzontali, successivamente al centro della nostra finestra. Glade ci chieder quanti pulsanti (colonne) si vuol inserire, inseriamo 3 e premiamo su OK. Quello che otterremo visibile nella figura sotto: Adesso abbiamo inserito i tre pulsanti, ma dobbiamo cambiare la scritta sul pulsante: il primo pulsante deve diventare Ricerca il secondo pulsante deve diventare Inserisci il terzo pulsante deve diventare Elimina Per fare questo, dobbiamo selezionare ogni singolo pulsante ed andare sulle propriet per cambiare la scritta.
Procediamo insieme: 1. fate un click sul primo pulsante. 2. andare sulla finestra propriet. 3. nella propriet etichetta, variate ci che c' scritto con la scritta Ricerca. Mentre variate la scritta, noterete che anche la scritta sul pulsante varia. 4. direi di assegnare anche un icona al pulsante, per far ci, andate nella propriet icona, premete sulla freccia per aprire la lista (combo box), vi apparir una serie di icone da scegliere. Scegliete l'icona Trova. 5. a questo punto, c' ancora una cosa molto importate da fare, assegnare un nome al pulsante. Questa operazione molto importante, il nome del pulsante, ci servir nel codice python, per riferirci a quel componente specifico. Il nome non deve essere mai casuale!!!. In genere io scelgo un nome che ne identifichi il tipo di componente e l'azione che deve svolgere. Nell'esempio specifico, il componente (witget) un pulsante e l'azione che svolge inserire un nome ed un numero telefonico nella nostra agenda; quindi un nome possibile potrebbe essere Bt_Ricerca (abbreviazione di Bottone di ricerca). Il nome deve essere messo nella propriet Nome, quindi sostituite quello che c' scritto, con Bt_Ricerca. 6. Ultima cosa che possiamo fare per abbellire il tutto, mettere un bel suggerimento per l'utente. Andate nella linguetta Common, nella sezione suggerimento inserire Ricerca il nome
Appunti di Python all'interno dell'achivio. Adesso andate col mouse sul pulsante, fermatevi e guardate ci che appare. 7. Adesso ripetiamo i punti da 1 a 6, per il secondo e terzo. Essi dovranno avere rispettivamente la scritta Inserisci e Elimina, l'icona Aggiungi e Elimina, i loro nomi saranno Bt_Inserisci e Bt_Elimina e nei suggerimenti sar inserito Aggiunge il nuovo numero e Elimina l'utente dall'agenda (guardate la nota sotto prima di procedere) ATTENZIONE!!! Avrete notato che all'interno del pulsante possibile selezionare ogni singolo elemento che lo compone (immagine e scritta), quello che noi vogliamo fare considerare l'intero bottone. Se selezioniamo solo l'immagine, vedremo SOLO le propriet dell' immagine stessa, ci che noi vogliamo variare, sono le propriet del pulsante. Per selezionare l'intero bottone dovete premere nel suo bordo o ancora meglio, utilizzate l'albero dei widget per selezionare i componenti, cos non avrete problemi (menu visualizza, mostra albero dei widget) NON vi preoccupate se i pulsanti si sovrappongono
Adesso vi ritrovate con i tre pulsanti sovrapposti e forse non perfettamente centrati. Non vi preoccupate, a tutto c' una soluzione :-) Noi abbiamo i pulsanti posizionati su una barra orizzontale, se spostiamo la barra, spostiamo tutti i pulsanti. Per quanto riguarda la sovrapposizione, evidente che questa dipende dal fatto che la barra troppo piccola. Correggiamo queste due cose, procedendo come segue: Visualizzate l'albero dei widget (dal men visualizza).
p.s. Notate la gerarchia degli oggetti, i pulsanti, come si pu vedere, stanno all'interno della barra
Adesso andiamo a vedere le propriet della barra (PRESTATE ATTENZIONE): noi dobbiamo ampliare la barra, avrete sicuramente notato la propriet dimensione in cui scritto 3. La traduzione in Italiano di questa propriet un po' forviante, essa infatti, si riferisce al numero dei pulsanti presenti su di essa (tre appunto) e non alle dimensioni fisiche. Le dimensioni della barra, si trovano, selezionando la linguetta Common, in cui presente la propriet larghezza. Aumentiamo la larghezza, in modo da creare ampi spazi tra i pulsanti. Fatto questo, selezioniamo la barra, premendo in uno spazio vuoto tra un pulsante ed un' altro e trasciniamola al centro, in
Per selezionare o spostare la barra premi nello spazio vuoto tra un pulsante e l'altro
Adesso dobbiamo inserire una casella di inserimento di testo in cui l'utente inserir il nome, ed una in cui verranno inseriti o visualizzati i numeri telefonici. Ormai siete in grado di farlo da soli, quindi, io vi elenco i componenti necessari, le loro propriet, e vi faccio vedere come deve venire, voi costruirete il tutto in modo autonomo. Ok, iniziamo..... Per la ricerca dovrete utilizzare un componente Inserimento testo la cui propriet nome dovr essere Tx_Nome. Per visualizzare ed inserire il numero telefonico, dovrete utilizzare un componente Inserimento testo la cui propriet nome dovr essere Tx_Telefono. Utilizzeremo inoltre 3 componenti label (etichette di testo) e un separatore orizzontale per migliorare l'aspetto. Questi sotto sono i componenti che utilizzeremo:
Inserimento testo
Il risultato che dobbiamo ottenere visibile nell'immagine successiva: Alla fine, dovete avere una finestra identica a quella sotto..... beh, due variazioni rispetto alla finestra sotto ve le concedo, al posto del nome Gianni scrivete il
Appunti di Python
vostro nome e il titolo della finestra, se volete, variatelo. Che dire, buon lavoro.
Adesso che la nostra finestra finita, non ci resta che salvare il nostro progetto. Per salvarlo, andate sul men project e scegliere Salva. Vi appare la finestra sotto:
Selezionatevi una cartella in cui inserire il progetto, date un nome al progetto e al file che verr salvato. Tutto il resto non importante per noi. Nel caso sopra, il progetto viene salvato nella cartella /usr/progetti/test/ con il nome di agenda.glade. Non vi fate ingannare dall'estensione, agenda.glade un file xml. Nella lezione seguente, vedremo come far funzionare l'applicazione con python.
Appunti di Python Provate a scrivere il testo sotto e salvatelo come agendagtk.py: # import gtk import gtk.glade # Carica Finestra ApplicazioneGlade = gtk.glade.XML("agenda.glade") gtk.main() Adesso andate sul terminale e scrivete python agendagtk.py Vedrete apparire la gui disegnata in tutto il suo splendore ma.... se provate a premere i pulsanti non succede nulla, se provate a chiudere la finestra, si chiude ma il terminale rimane congelato. Usate ctrl+c per bloccare l'esecuzione del codice. E' ovvio che manca ancora qualcosa. Quando noi eseguiamo il codice sopra, di fatto creiamo degli oggetti. Tutti i controlli (pulsanti, finestre, caselle di testo ecc...) inseriti nella nostra applicazione sono oggetti. Ogni oggetto ha delle propriet e dei metodi. Per semplificare le cose possiamo dire che le propriet sono tutte quelle caratteristiche che contraddistinguono il singolo oggetto. Un esempio dato dal nome: tutti gli oggetti hanno un nome. Se consideriamo un campo di immissione testo ha, tra le propriet, il valore (dato) contenuto in esso, posizione, grandezza ecc... Quindi abbiamo capito cosa sono le propriet, ci si poteva arrivare anche dal nome stesso. Ma i metodi cosa sono? In modo molto semplicistico e rapportato unicamente agli oggetti dell' interfaccia grafica, potremmo chiamare i metodi con un nome molto pi comprensibile: eventi. Gi il nome evento evoca un qualche cosa che si verifica in un determinato attimo o ad una determinata azione, infatti cos. Per fare un esempio, noi vogliamo che alla pressione del tasto Ricerca (evento), il programma esegua la funzione relativa alla ricerca e visualizzazione del nome. Quindi gli eventi sono le azioni (funzioni) che vengono eseguite al verificarsi di un azione (evento). In glade, gli eventi vengono chiamati segnali. Ora, avrete capito quello che manca alla nostra applicazione: il legame tra l'evento e l'azione (funzione), quindi quando noi premiamo sul pulsante ricerca (evento), non c' definita nessuna azione (funzione). Allo stesso modo, quando chiudiamo la finestra (evento), non viene interrotta l'applicazione. Rileggete questi due paragrafi, cercate di capire il concetto, poi richiamate glade ed il progetto agenda e vediamo in pratica.
Appunti di Python sull'oggetto di immissione testo relativo al nome, vedrete una finestra simile a quella sotto (se non la vedete potete richiamarla dal menu visualizza/mostra editor delle propriet: Quelle sono le propriet dell'oggetto di immissione testo. Il nome la propriet che identifica il singolo oggetto, cambiamo questa propriet e scriviamo nome Class ci indica il tipo di oggetto (da non cambiare assolutamente) Modificabile, Testo visibile ecc.. si commentano da soli Testo il testo di default da visualizzare, provate a variarlo e guardate che cosa succede. Limitatevi a smanettare solo sulle prime 3 linguette (widget, packing e common). Dopo che avete fatto un po' di esperimenti rimettete tutto come prima, variando solo la propriet Nome (al posto di entry1 scrivete nome). Fatto questo richiamate (facendoci un click sopra l'oggetto) le propriet dell'oggetto di immissione campo (da adesso in avanti chiamati gtkentry) relativo al numero di telefono. In questo caso vedrete che la propriet class la stessa, poich sono oggetti uguali, con propriet diverse ma appartenenti al solito tipo. Per questo oggetto cambiate la propriet Nome da entry2 a telefono. Detto in parole molto semplici, potremmo dire che le propriet sono le caratteristiche dell'oggetto. Per capire meglio il concetto, faro un esempio rapportabile alla realt di tutti i giorni: immaginate di voler costruire un automobile. Per prima cosa progettate l'auto e costruite lo stampo, ovvero tutte quella catena di montaggio necessaria alla sua costruzione. E' ovvio che quella catena di montaggio in grado di costruire quel particolare tipo di auto. La catena di montaggio si pu paragonare alla classe. La classe una specie di stampo, da cui viene generato l'oggetto. Se guardate la figura sopra, noterete che c' una propriet chiamata class (sotto la voce nome), quello ci indica da che classe deriva l'oggetto e quindi il tipo di oggetto. Tornando alla nostra catena di montaggio, con essa costruiremo auto, vero che ogni auto sar uguale all'altra, ma ogni una potrebbe avere caratteristiche diverse (colore, colore interni, cilindrata ecc..). Queste caratteristiche sono come le caratteristiche degli oggetti, tutti gli oggetti hanno propriet che possiamo impostare a nostro piacimento (nel caso di un oggetti GtkEntry nome, lunghezza, testo ecc...). Facciamo un altro passo indietro e guardiamo la nostra automobile; quando l'abbiamo costruita, abbiamo deciso che: premendo sul pedale l'auto parte, spingendo un pulsante si azionano i tergicristalli, premendo un altro pedale l'auto si arresta e cos via. Tutte queste azioni sono conseguenti ad un evento. Nel nostro oggetto, gli eventi si chiamano metodi, ma per maggior comprensione, continueremo a chiamarli eventi. Un evento pu essere la pressione di un pulsante, la chiusura di una finestra, la scrittura di testo in un oggetto GtkEntry ecc.. Quindi gli eventi ci permettono di definire le azioni da intraprendere al verificarsi di certe azioni. Ora, pensate un secondo alla nostra applicazione, quando si chiudeva la finestra l'applicazione non si chiudeva (la finestra si chiudeva ma il programma python rimaneva congelato). Forse adesso sarete riusciti a capirne il motivo: non c'era un legame tra l'evento (chiusura della finestra) e l'azione (chiusura dell'applicazione). Prima di procedere, vi invito a rileggere bene quest' ultimo paragrafo.
Appunti di Python
Appunti di Python definito alcune righe sopra con: ApplicazioneGlade = gtk.glade.XML("agenda.glade") Adesso andate sul terminale, posizionatevi sulla cartella del vostro progetto e scrivete: python agenda.py Apparir la finestra dell'agenda, ma adesso, se chiudete la finestra, verr chiusa anche l'applicazione ed il terminale sar rilasciato. Questo perch alla chiusura della finestra, viene eseguita la funzione gtk.mainquit che termina il programma, come definito dall'istruzione: dic ={ "on_window1_delete_event":gtk.mainquit } Rileggete la parte sopra fin quando non vi chiaro al 100% il funzionamento. Quello che vedremo in seguito la logica conseguenza di ci che avete letto fino ad ora.
Appunti di Python # Collega gli eventi dic ={ "on_window1_delete_event":gtk.mainquit, "on_Bt_Inserisci_clicked":Inserisci, "on_Bt_Ricerca_clicked":Ricerca, "on_Bt_Elimina_clicked":Elimina } Scriveremo ora le funzioni Inserisci, Ricerca ed Elimina. Iniziamo con la funzione di Inserimento. Essa non sar molto differente dalla funzione di inserimento che avevamo creato all'inizio di questo tutorial. Possiamo scriverla in questo modo: def Inserisci(obj): DizionarioNumeri[ApplicazioneGlade.get_widget('entry1').get_text()] =ApplicazioneGlade.get_widget('entry2').get_text() Attenzione la riga dopo la definizione della funzione continua con la riga immediatamente sotto. Spieghiamo un attimo l'istruzione apparentemente complessa. DizionarioNumeri il nostro dizionario definito con: DizionarioNumeri = {} ApplicazioneGlade la nostra finestra, definita con la riga: ApplicazioneGlade = gtk.glade.XML("agenda.glade") Dove ApplicazioneGlade diventa un oggetto generato dal file agenda.glade (il file salvato con glade) ApplicazioneGlade.get_widget('entry1').get_text() L'istruzione sopra significa: prendi il testo contenuto nel controllo entry1 dell'oggetto ApplicationGlade, in poche parole prende la finestra (ApplicazioneGlade), all'interno della quale prende l'oggetto entry1 (get_widget('entry1')). Di quest'ultimo oggetto, prendi la propriet get_text (cio il suo contenuto). Sembra complesso, ma se ne capite il funzionamento, vi risulter naturale scrivere il codice. Ora, qualcuno si dovrebbe essere chiesto: ma come facevi a sapere che entry1 ha una propriet chiamata get_text? Semplice, mi sono letto la documentazione. Prima di procedere, facciamo un secondo di pausa e riflettiamo su come dev'essere letta la documentazione. Se andate sul sito delle pygtk, nella sezione della documentazione, troviamo una pagina in cui c' scritto: PyGTK Class Hierarchy, cio, gerarchia della classe pygtk. http://www.pygtk.org/pygtk2reference/class-hierarchy.html Essa mostra tutti i componenti e le loro derivazione delle classi GTK. Quindi abbiamo tutte le propriet ed i metodi delle GTK (le propriet ed i metodi dei pulsanti, delle griglie, degli entry ecc...). Ora, quello che noi abbiamo usato per l'immissione del nome e del numero telefonico un oggetto gtk entry (guardatelo nella propriet class su glade). Bene, adesso cercate, nella pagina della documentazione, la parola gtk.entry (solo gtk.entry !!!). Premeteci sopra per vedere la documentazione relativa a quell'oggetto. Ora dovreste avere una pagina che vi elenca le propriet, tra queste c' anche get_text, se ne andate
Appunti di Python a vedere il documento relativo, scoprirete che: The get_text() method returns the value of the "text" property which is a string containing the contents of the entry, praticamente questa propriet contiene il valore inserito nell'oggetto entry. Tutto questo pu sembrare complesso, ma una volta capito, molto semplice da applicare. Non scordiamoci che python un linguaggio ad oggetti e quello che avete visto fin'ora (propriet e metodi), stanno alla base di questo tipo di programmazione. Ora vi invio il codice completo che inserisce e ricerca numeri telefonici del dizionario. Il programma funziona, ma necessita di molti aggiustamenti e migliorie che voi provvederete a fare. Le cose che andranno fatte sono: 1. Implementare un sistema di salvataggio dei dati in un file (come l'agenda da linea di comando del nostro primo esempio). Vi suggerisco di aggiungere un pulsante per il salvataggio, poi aggiungere un evento e collegarlo alla funzione di salvataggio 2. Implementare un sistema di caricamento dei dati dal file in memoria (vedi suggerimento sopra) 3. Ad ogni inserimento cancellare il contenuto dei due entry usati Prima di iniziare a smanettare, cercate di capire ogni singola riga del programma ed andate a vedere le propriet degli oggetti utilizzati, nella pagina di documentazione di pygtk. L'esercizio, per dei principianti, non facilissimo. Non scoraggiatevi perch capire tutto questo, significa aver capito come si pu fare un'applicazione con python e le gtk. Di seguito il codice python della nostra agenda: import gtk.glade # Carica Finestra ApplicazioneGlade = gtk.glade.XML("agenda.glade") DizionarioNumeri = {} def Ricerca(obj): if DizionarioNumeri.has_key(ApplicazioneGlade.get_widget('entry1').get_text()): ApplicazioneGlade.get_widget('entry2').set_text (DizionarioNumeri[ApplicazioneGlade.get_widget('entry1').get_text()]) def Inserisci(obj): DizionarioNumeri[ApplicazioneGlade.get_widget('entry1').get_text()] ApplicazioneGlade.get_widget('entry2').get_text() def Elimina(obj): if DizionarioNumeri.has_key(ApplicazioneGlade.get_widget('entry1').get_text()): del DizionarioNumeri[ApplicazioneGlade.get_widget('entry1').get_text()] ApplicazioneGlade.get_widget('entry2').set_text('') ApplicazioneGlade.get_widget('entry1').set_text('') # Collega gli eventi dic ={ "on_window1_delete_event":gtk.mainquit, "on_Bt_Inserisci_clicked":Inserisci, "on_Bt_Ricerca_clicked":Ricerca, "on_Bt_Elimina_clicked":Elimina } #Connessione delle calllback ApplicazioneGlade.signal_autoconnect(dic) gtk.main()