Sei sulla pagina 1di 46

AppuntidiPython

AppuntidiPython
ScrittodaGiustiGianni giannigiusti@tiscali.it

AppuntidiPython

Checosacontienequestodocumento
Questodocumentocontienelamiaesperienzapersonaleconpython.Iltesto,inalcuneparti, scritto acaldo, intendendoconquestotermine,lascritturadicicheapprendo,immediatamente dopo averla appresa. Proprio per questo, il codice che troverete non risulter ottimizzato e probabilmentefarinorridireigurudelpython. Sonobenaccetticonsiglisulcodice,sullastesuradeldocumentoecc..Sonobenaccettepurele critichenegative,purchsianofatteconunoscopocostruttivoenondistruttivo.

Qualcheringraziamento
Primadiiniziarevorreifarealcuniringraziamenti(inordinesparso): Stefano Pardini (http://www.compaiuto.it/) e Comick (http://www.comick.net/) per le pubblicazionisulweb. PanthereZengarZamboltperlecorrezioniegliutiliconsigli QuestepersonesonoreperibilisulforumdelLUGVersiliaLuccaMassaeCarrara(comemetra l' altro)www.tivedotonico.it redclayperillinkalinkpergladeepygtkperwindows redclaylotrovatesulNGdipython

Perchhodecisodiscrivereiltesto
Quandosiiniziaadimparareunnuovostrumentodisviluppo,sihasempre difficoltatrovare documentazione,esempi,librerie,strumentiecc...Poic' ladifficoltdiiniziare...capirecomesi deveprocedere,glistrumentidausare,comeavvengonoleinstallazioniecc...Tuttecosemolto ovvieebanaliperchiconoscelostrumento,talmenteovviechepoicisiscordadic omunicarle ai novizicomeme. Inquestotestovogliodescriveretuttocicheincontrerduranteilmiocammino,ledifficolt,gli errori,imotividellemiescelte. Cercherdiscrivereinmodosempliceecomprensibilepossibile,conunocchiodiriguardoper chinonhamaiprogrammato. Sperochesiautileaqualcuno.Buonalettura.

Glistrumentidipythonsceltiperlosviluppo
Dovendoscriveregui(interfaccegrafiche),perprimacosahocercatoilmodoincuipythonpermette lascritturadigui. Cisonodiverselibreriechesipossonoutilizzarepertalescopo: Tkinter,wxWindows,QT,GTKecc... HoesclusoTkinterperchproduceinterfacceesteticamentebrutte. HoesclusoQTperchproprietarieelaversionewindowsnonpermettelosviluppodiapplicazioni commerciali. LewxWindowssonoottimelibrerie,mahooptatoperleGTKperchoffronounottimostrumento per il disegno delle gui, chiamato glade, inoltre funzionano anche su windows. I programmi,

AppuntidiPython ovviamente,sonoperfettamenteintegraticongnome(ilmiodesktopmanagerpreferito). ComedatabasehosceltoMySql,masolopersempliciteportabilit,vistochesonoall' iniziocon Python,hocercatoglistrumentipisemplici,inmododaconcentrarmiunicamentesullosviluppo. Ok, adesso che vi ho detto gli strumenti che user, se volete seguire la mia strada, dovrete procurarvi: 1) Python2.3(http://www.python.org/2.3/) 2) MySqlperwindowseperLinux(www.mysql.com). 3) Glade(http://glade.gnome.org)(solopergliutentiLinux).Disponibilesututteledistribuzioni. Unringraziamentoparticolarearedclaychemihapostatoquestolink: http://www.pcpm.ucl.ac.be/~gustin/win32_ports/pygtk.htmlincui,gliutentiwindows,possono trovareGladeperwindows(dicuiignoravol' esistenza).Gliutentiwindowscheinstallanoi pacchetti,siricordinodiinserirenelloropathilpercorsodellelibrerieGTK: C:\Programmi\Filecomuni\GTK\2.0\bin 4) IlsupportoperusareMySqlconpython:mysqlpython(http://sourceforge.net/projects/mysql python). 5) IbindingpyGTK(http://www.daa.com.au/~james/software/pygtk/). 6) LelibrerieGTKperwindows(ovviamentesolosuwindows: http://www.dropline.net/gtk/download.php). 7) Uneditorditestoavostrascelta,megliosesupportalasintassicolorataperpython(iouso bluefish,mapoteteusarevi,emacs,quantaoquellochevipiacedipi). Qualcunosistarchiedendo cimetterunavitaadinstallareiltutto! ...noncos: Ipacchettinonsonograndi(escluselelibrerieGTKperwindows:5Mbca) Leinstallazionisonoestremamentesemplici.Sottowindowstuttoautomatico;sottolinux, probabilmentetroveretetuttiipacchettisuicddellavostradistribuzione. Losvilupposisvolgertuttosottolinux(simettanol' animainpacegliutentiwindows),male applicazionigeneratefunzionerannosuentrambelepiattaforme. Traipacchettiinstallati,avretenotatoGlade.Questoprogrammacipermetterdi disegnare le finestre.E' estremamentesemplicedausareehatuttoilnecessario...inpocheparole:sempliceed essenziale(ottimoperchiinizia). Chisi aspettadiiniziareadisegnareform,rimmarrdeluso:ilpassosuccessivosarquello di iniziareaprogrammarepiccoliesempisenzagui. Questomododiprocedereciservirperimpararelepocheistruzionidi python.S,avetecapito bene, pythonhapocheistruzioni,il restosonomoduli aggiuntivechenontratteremoinquesto tutorial.

Dadoveiniziamo
Perprimacosa,sicreiunadirectorychiamata progettidove metteremoinostriscriptpython. Primadiiniziarericordateche: 1. Gliscriptdovrannoaverel' estensione.py 2. L'idntazionedelcodice(spazitrailbordosinistroedicomandi),fapartedellasintassipython. e L'idntazioneDEVEesserefattaconiltastotab(queltastovicinoalla'q', e giustopercapirci) Sbagliarel'idntazionesignificagenerareerrori e

AppuntidiPython 3. Leistruzionipythonnonhannounapunteggiaturacheneindicalafine. 4. Pereseguireilcodicepythonbastascrivere: 5. pythonnomescript.py(inrealtnonl' unicomodo,maquellocheseguiremopersemplificarci lavita)

Eadessoiniziamo!!
Ok,iniziamoconunsempliceesempio: 1) Apriamoilnostroeditor 2) Creamounfilechiamatotest.pysottolacartellap rogetti( precedentementecreata) 3) All'int ernodelfilescriviamo: print'H elloWorld' 4) Adessoapriamoilterminale 5) Posizioniamocisottolacartellap rogettie scriviamo:pythontest.py 6) VerrvisualizzatalascrittaHelloWorld L'e sempiosempliceeilrisultatoabbastanzascontato:l' istruzioneprintstampaavideo. Adessoproviamoadaggiungere: print'H elloWorld' print Oggiunabellagiornata print Lasommatra2+2: print2+2 Seeseguiteloscritp,virestituir: HelloWorld Oggiunabellagiornata Lasommatra2+2e: 4 Quindisiconcludeche: 1) Laprintfunzionaanchecondoppiapici 2) Laprint,seincontranumericonoperazionimatematiche,nerestituisceilrisultato 3) Tuttocichetraapiciedoppiapicivieneconsideratocomecaratteregenerico.Avretenotato che2+2tragliapicinonhaprodottoilrisultatodi4maseplicementelastampadi2+2.

LeVariabili
Perchinonsacosasonolevariabili,possiamodirecheunavariabileuncontenitoreincuinoi andiamoamettereunvalorenumerico,unaseriedicaratterienumeri,unvaloreboleanoecc...Le variabilepossonoassumerediversitipidivalore,persemplicitnoivedremolestringheeinumeri (intesicometipogenerale): Stringa(unaseriedilettere,numeri,punteggiaturaecc..) Esempidistringhe:

AppuntidiPython Questaunastringa Questa,anchesecontieneilnumero2comunqueunastringa 2+2 ecc.. Lestringhesonoscrittetrasingoliapiciodoppiapici.Seunastringainiziaconundoppioapice, DEVEfinireconundoppioapiceeviceversaperilsingoloapice ATTENZIONE!! Notareche 2+2 unastringa,cisignifivacheiduenumerinonsonoconsideratinumerima comesefosserolettere.Quindi 2+2 nonritornailvaloredell' operazionematematica! Numerici(unnumerointeroodecimale) Inumericisidividonoalorovolta,secondoiltipodivalore(intero,doppio,realeecc..). Cercheremodivederesoloipicomuni. Esempidinumerici: 2 1000 2.2 2.00 ecc.. Suinumericipossonoessereapplicatelecomunioperazionimatematichedi: +(somma) (differenza) /(divisione) *(Moltiplicazione) %(Modulo) Sipossonoancheusareleparentesitondeperdeterminarel'or dinediesecuzionedell'oprazione. e Facciamoqualcheesempiopercapireladifferenzatranumericiestringhe: print'52=' + print5+2 print (3*4)/2= print(3*4)/2

Ilcodicesopraproduce: 5+2= 7 (3*4)/2= 6 Senonriusciteacapirequestiesempi,doveterileggerviilcapitolosopra,poichsignificachenon avetecapitoladifferenzatraunastringaedunnumero.CapirequestadifferenzaESSENZIALE!! Proviamoavariarel' esempioinquestomodo:

AppuntidiPython print'52=', + print5+2 print (3*4)/2=, print(3*4)/2 Sonostateaggiuntedue virgoleallafinedelle stringhe.Ilrisultatocambiain: 5+2=7 (3*4)/2=6 Sideducechelavirgolaunisce,duestringheoduerisultatididueprint.Notarechel'unionconla e virgolalasciaunospaziotraleduestringhe. Tornandoallevariabili,essepossonoesserescritteinconqualsiasicarattereesclusiinumerise messicomeprimocarattere.Esempidivariabilesono: Nome=' Gianni' Nome1=' Gianni' entrambelevariabilisonocorrette.NellavariabileNomecivailvalorestringa' Gianni' ,stessacosa perlavariabileNome1. ATTENZIONE!! Leassegnazioniavvengonosempredadestraasinistra.Scrivere' Gianni'= Nome,noncorretto!! Adessopassiamoavederequalcheesempiodivariabile: Nome='G ianni' Cognome=' Giusti' Email=' giannigiusti@tiscali.it' print' Iomichiamo' ,Nome,Cognome print'LmiaEmail:',E ail a m Questoproduce: IomichiamoGianniGiusti LamiaEmail:giannigiusti@tiscali.it poich: vienestampato' Iomichiamo' poic' unavirgolaesuccessivamentelavariabileNome,quindivienestampatoilcontenutodi quellavariabile.IdemperLavariabileCognome.Lavirgolaunisceduestringheeinserisceuno spaziotraledue ATTENZIONE!! Scrivere:print' IomichiamoNomeCognome' sarebbe stato sbagliato perch Nome e Cognome vengono considerate stringhe....provare per credere. P.S. Scrivereilcodicesottocorretto: stringa='22=' + numero=4 printstringa,numero Adessoallenateviunpo' conlevariabilieconlaprint.Magarifatequalchepiccoloscriptchefaccia qualche operazione di calcoli di volumi e superfici di figure geometriche (tipo: altezza=10 lunghezza=10,superfice=altezza*lunghezzastampateilrisultato).

AppuntidiPython ATTENZIONE!!! Levariabilisonosensibilialmaiuscolo/minuscolo,cisignificachescrivereadesempio: Nome=' Gianni' printnome NonotterremolascrittaGianni,maunerroreN ameError:name'nom isnotdefined. Questo e' perchlavariabile'Nom elavariabile'nom nonsonolastessavariabile.Quandofacciolaprint, e' e' giustameneteperpython,lavariabile'nom e'nonri sultadefinita. Quindi,nelcasosopraocambioNomeinnomeocambioprintnomeinprintNome. Notapersonale Nelmiopersonalemododidichiarareleveriabili,ingenereusolemaiuscoleperleprimelettere chemiidentificanioinqualchemodolevariabili.Esempio: Sedevocreareunavariabilecontenenteilnomeedilcognomediunapersona,lachiamer: NomeCognome=' Gianni' Questoservesoloadunaletturamiglioredelcodice.

AppuntidiPython

Inputdatastiera
Finoadoratuttook,masevolessimofareunpiccoloprogrammachecalcolal' areadiunrettangolo conivaloriimmessidaunutente? Inquestocasocivengonoinaiutodeicomandiche' catturano' ivaloriimmessitramitetastiera. (questaoperazionedetta' inputdatastiera' ,cio,prendereiningressoivaloridigitatidall'ut ente) L' istruzionechepermettediprenderedeivalorinumericiininputsichiamaproprioinput. Valore=input(' digitaunnumero' ) Questosopraunesempiodell' istruzioneinput.Essascriveavideo' digitaunnumero' easpettache l'ute immetta dei valori e prema su enter (invio). Fatto ci assegna il valore immesso alla nte variabileValore.Vediamounesempio: lunghezza=input('D ammilalunghezzadelrettangolo:') larghezza=input('Damm ilalarghezzadelrettangolo:' ) area=lunghezza*larghezza print"L' areadelrettangolo",area Eseguiteilcodicesopraeguardateglieffetti. Facilevero? Eseguitel' esempiosopramadateininputunastringa,noteretechevivienerestituitounerrore, questoperchl' istruzioneinputsiaspettavalorinumerici.Inrealtpossibilepassarevaloristringa allainput,sevengonoracchiusitraapici. Sevoleteprendereiningressovaloristringa(alfanumerici),sideveutilizzarel'ist ruzioneraw_input. Lasintassilastessadellainput. Primadiprocederevilascioconunpiccoloeserciziodafare: fateunprogrammache,sapendolemisure(altezza,lunghezzaespessore)diunbloccodimarmo, mi determini quante lastre si possono ottenere, dato uno spessore lastra immesso dall'ut ente. Dovreteinoltrecalcolareimetriquadratitotalidellelastre. Esempio: lunghezzablocco=400cm altezzablocco=150cm larghezzablocco(spessore)=200cm spessorelastra=2cm quindi.... Nlastre=200/2 Arealastre=NLastre*(lunghezza*altezza) beh,praticamentevihodettotutto.....:)

AppuntidiPython

Liste,dizionarietuple
Liste Unalistaunasequenzaordinatadioggetti.Dettoinparolemoltosemplici,unalistavavistacome unaspeciedivariabilechepuassumerepivaloricontemporaneamente. Esempiodilista: listagiorni=['Lund'Marted','M e ,' ercoled',' Gioved','Sab ] ato' Nell' esempio,abbiamocreatounalistachiamatalistagiorni,contenenteivalori' Luned', arted' 'M ecc... L' istruzione printlistagiorni[1] restituisce'Ma rted' questoperchilprimoelementodiunalistal' elementozero. Esistonomoltefunzioniinteressantisulleliste.Tralepiimportanti: append=inserisceunnuovoelementoallalista esempio: listagiorni.append(' Domenica' ) aggiungeDomenicaallanostralista del=eliminaunelementoinunalista esempio: dellistagiorni[0] eliminaLuneddallanostralista sort=ordinaunalista listagiorni.sort() Metteinordinealfabeticolanostralista range() = Essa prende in ingrasso un numero e restituisce una lista contenente una sequenza. Esempio: listanumeri=range(5) Questacreaunalistacontenenteunasequenzadinumeridallo0al4 Seavessiusatol'istruionerangeinquestomodo: z listanumeri=range(2,5) avreiorrenutolalistaconsequenzadinumericompresitrail2compresoeil5escluso,poich l'i ntervallodi5elementi(quindidallo[0,1,2,3,4]),masiquestielementivogliosoloquellidal numero2inpoi,quindi[2,3,4] Tuple Letuplesonodellespecialiliste,ilcuicontenutoimmutabile.Quindi,nondisponedelleistruzioni tipichedellalista. Unesempioditupla: listagiorni=('Lund'Marted','M e ,' ercoled',' Gioved','Sab ) ato' Notarechelatupladefinitaconparentesitonde!!

AppuntidiPython Dizionari Ildizionariounacollezione,nonordinata,dioggetti.Questosignificache,adifferenzadilistee tuple,glielementichelacompongonosonoidentificatidaunachiave.Ognielementodeldizionario infatticompostodaunachiaveedunvalore.Lachiaveserveperilrecuperodelvalore. Vediamounesempio: agenda={'nome anni',' ' :'Gi cognome' :'Giusti',' :'gi email' annigiusti@tiscali.it'} Notarecheidizionarisonodefinititraleparentesigraffe. Nelnostroesempio,l'ist ruzione printagenda[' nome' ] restituisce'Gi anni' Ancheperidizionari,comeperleliste,esistonomoltefunzioniinteressanti.Tralepiimportanti: len=ciindicaquantielementicompongonoildizionario esempio: printlen(agenda) l'i struzionesopra,nelnostrospecificoesempio,restituisce3 has_key=ciindicaseesiteunaspecificachiave.Restituisce1sepresente,altrimenti0 esempio: agenda.has_key('nom ) e' restituisce1 keys=restituisceunalistacontenenteinomidellechiavi esempio: printagenda.keys() restituisce['nome cognome',' ] ' ,' email' values=restituisceunalistacontenenteivalori.Funzionacomelakeysvistasopra del=eliminaunachiaveeilsuovalore,daldizionario esempio: delagenda['nom ] e' Peraggiungereunachiaveeilsuovalore,adundizionarioesistente,vederel'e sempiosotto: agenda['pginaweb']=www.paginaweb.gia' a ' l' esempiosopraaggiungelacoppiachiave/valore' paginaweb':'www.p aginaweb.gia' Perconcluderevediamounesempiosimpatico. Unendo una lista ed un dizionario, possiamo creare una struttura simile ad una tabella di un database.Ammettiamochevogliofareunatabellainram,chiamataagenda,contenenteilnome,il cognomeegliindirizzidiamici.Basterfareunalistadidizionariedilgiocofatto: agenda=[] agenda.append({'nom 'Giannicognome':'Giusti','e'gi e': ' ,' mail': annigiusti@tiscali.it'} ) agenda.append({'nom 'Cmick',' e': o cognome':'',' 'in email': fo@comick.net'} ) agenda.append({'nom 'Rssi' e': o ,'cognom e':'Bian email'rossibianchi@abcde.it'} chi',' :' )

AppuntidiPython Nell' esempioabbiamolalistaagenda,compostada3dizionari. printagenda[0] restitituisceildizionario{' nome':'Gi anni','c ognome' :'Giusti' ail': annigiusti@tiscali.it'} ,'em 'gi Adessoattenzione: printagenda[0][' nome' ] restituisce 'Gi anni'.Questo perch viene preso il primo elemento della lista agenda, poi, dal dizionario,ilvaloredellachiave' nome' ,inquestocasoGianni. p.s. Leparentesigraffeconlinux,possonoesserefatteconitastiAltGr+7eAltGr+0

Istruzionidibase
Istruzioneifewhile In questa sezione studieremo le istruzioni pi usate, quelle istruzioni che prima o poi tutti utilizzano.Iniziamoconlestrutturedicontrollo. Spessosihalanecessitdiverificarechecertecondizionisiamoverificate.Seconsideratel' esempio sotto, lunghezza=input('D ammilalunghezzadelrettangolo:') larghezza=input('Damm ilalarghezzadelrettangolo:' ) area=lunghezza*larghezza print"L' areadelrettangolo",area notereteche,sel' utenteimmettenumerinegativi,ilprogrammaliprendeelielabora,restituendoun risultatonegativo.Ovviamenteunareanegativanonpuesistere,quindiciservirebbeunistruzione checontrollailrisultato....unqualcosachepossaverificarechelavariabileareanonsiaminoredi zero,nelcasolofosse,dovrebbeavvisarel' utente.Quindi: sel' area<oppure=azeroscrivia ttenzioneidatiimmessinonsonocorretti! Listruzionechefaquestosichiama ifquindiilc odicerisultaessere: ifarea<=0: printA ttenzione,inumeriimmessinonsonocorretti! printE seguirenuovamenteilprogramma else: print"L' areadelrettangolo",area Analizzandoinsiemeilcodice: perprimacosasiscrivel'ist ruzionei f poilacondizione(inquestocasoseareaminoreouguale azero).Fattocisimetteiduepunti :, sivaacapoesipremesultastotabperspostarcidiuna tabulazione. Questo spostamento INDISPENSABILE e tutti ci che si trova spostato di una tabulazione,sottola if ,vieneeseguitaselacondizionevera.Nelnostrocasospecifico,sel' area minoreougualeazero,vienestampatoavideo: Attenzione,inumeriimmessinonsonocorretti! Eseguirenuovamenteilprogramma Cioledueprintimmediatamentesotto.Capiteadessol' importanzadellatabulazione. Avetenotatochec' ancheunistruzionechiamata else .Essastrettamentelegataallai f, in italianopotrebbeesseretradottacon altrimenti.Ne lnostrocasospecifico: sel' area<oppure=azeroscrivia ttenzioneidatiimmessinonsonocorretti! altrimentiscrivi"L' areadelrettangolo",area Vediamooral' esempiocompleto:

AppuntidiPython lunghezza=input('D ammilalunghezzadelrettangolo:' ) larghezza=input('D ammilalarghezzadelrettangolo:' ) area=lunghezza*larghezza ifarea<=0: print Attenzione,inumeriimmessinonsonocorretti! print Eseguirenuovamenteilprogramma else: print"L' areadelrettangolo",area provateadeseguireilcodice,immettendovalorinegativiepositiviininput. Forsealcunidivoiavrannonotatoche,nelmetodoconcuiabbiamorisultoilproblemadeivalori negativi,c' unerrorediconcetto: l' errore di immissione dati andrebbe segnalato immediatamente dopo l' istruzione input. Questo permetterebbelacorrezzioneimmediatadeldato,senzailbisognodirieseguireilprogramma.Ci servirebbeunistruzionechepermettedifarequestadomanda: finchlalunghezza<=azero,nonandareavantiecontinuaachiedereivalori Stessacosaconlalarghezza. Inquestocasocivieneinaiutol'ist ruzionew hile.L asintassilaseguente: whilelunghezza<=0: lunghezza=input('Da mmilalunghezzadelrettangolo:' ) L' istruzionesempliceedintuitiva,essaripetetuttoquellochesitrovasottodiessa,spostatadiuna tabulazione,finquandononsarsoddisfattalacondizione.Nelnostrocasospecifico,finquandola variabilelunghezzanonsarminoreougualeazero,continuaachiedereilvaloredilunghezza. Riguardandoilnostrocodiceoriginale,possiamovariarloinquestomodo: lunghezza=0 larghezza=0 whilelunghezza<=0: lunghezza=input('D ammilalunghezzadelrettangolo:') whilelarghezza<=0: larghezza=input('Damm ilalarghezzadelrettangolo:' ) area=lunghezza*larghezza print"L' areadelrettangolo",area Adessoviinvitoaprovareilcodice,immettendovalorinegativi. Ladifferenzatral' istruzionei f ela while evidente,entrambeverificamounacondizione,ma nelcasodella if ,alverificarsionodiessa,ilprogrammaprocede.Nelcasodellawhil e ,il codicealsuointernovieneeseguitoFINOACHEnonsiverificalacondizionestessa. Dettoquesto,modificatemiilprogrammasopra,inquestomodo: vogliocheilprogramma,dopoavercalcolatol' areadelrettangolo,chiedasevogliocalcolareuna nuovaarea. Incasoaffermativo,mideverichiederelemisure,ricalcolarel' areaerichiederese voglio calcolare una nuova area. Tutto questo, fin quando l' utente non risponde N all' ultima domanda(Ca lcolareunanuovaarea?) .Unpiccoloaiuto:attenzionealtipodiinstruzione input dausare!! CicloFor Ilciclofor,permettediiterareunalista.Inpocheparoleessopermettel' estrazionedituttiidatidi

AppuntidiPython unalistael' esecuzionedelcodiceidentatosottodiesso. Pifacilevedereunesempiochespiegarlo: giorni=['Lned','M u arted','M ercoled','Giov ,'Ve ed' nerd','Sab ' ato', Domenica' ] forgiornisettimanaingiorni: printgiornisettimana ilcodicesoprastampaavideoinomideigiornidellasettimana.Analizzandoilcodicenotiamoche ilcomandoforhalaseguentesintassi: parolachiavefor+nomevariabile+parolachiavein+listadacuiestrarreidati+: Tuttoquestopusembrareunpo' stranodachiprovienedaaltrilinguaggi,abituatiadusareilfor principalmenteperripetereunapartedicodicepernvolte.Inrealtquestosipufareanchecon python,manoncertoquestol'us oprincipalechenevienefatto. Esempiodiripetizionedelcodivepernvolte: forvariabileinrange(5): print'Gi anni' ilcodicesoprastampaavideo Gianni per5volte. Un' altrousochesipufaredelforl'it erazionediundizionario: db={'nom :' e'Gianni',' cognome':'Giusti' ' ,' email': giannigiusti@tiscali.it'} fork,vindb.items(): printk,' =',v Dall' esempiosoprastatousatoitems()cheestrarelacoppiachiave/valoredeldizionario. Ilrisultatodiquelcodice: cognome=Giusti email=giannigiusti@tiscali.it nome=Gianni

AppuntidiPython

FunzionieModuli
Finoadoraabbiamovistoicomandidibasechecipermettonodiscriveredelcodice.Adesso inizieremoafareprogrammiunpo' picomplessi,quindiavremobisognodiampliarelenostre conoscenze.Laprimacosachevedremosonolefunzioni. Lefunzionisonodelleporzionidicodiceautonomi,atteasvolgeredeterminaticompiti.Iningresso possonoprenderedeivalori(parametri),elaborarlierestituireunrisultato. Ivantagginell'uso dellefunzionisonomolti,traiquali: permettonoilriutilizzodelcodice eliminanoilcodiceridondante ilcodicevienedivisoinblocchiomogenei ecc... Unafunzionedeveesserescrittaconlaseguentesintassi: parolachiavedef+nomefunzione+(+parametridivisidavirgola+)+: istruzioni parolachiavereturn+risultato Esempio: Sevolessicreareunafunzionechecalcolal' areadiunrettangolo(giustoperriprendereunvecchio esempio),potreifare: defAreaRettangolo(lunghezza,larghezza,altezza): area=lunghezza*larghezza*altezza returnarea adesso,perutilizzarelafunzionebasterrichiamarlaconilnomeepassareiparametri: altezza=10 largezza=5 lunghezza=15 print' Ilrettangolohaunareadi',A reaRettangolo(lunghezza,largezza,altezza),'Me tri' bene,adessoprovateadeseguiretuttoilcodice,ilrisultatosarlastampadi: Ilrettangolohaunareadi750Metri Attenzione!! Levariabiliusateall' internodellafunzionesonodettevariabililocaliinquantohannovaliditsolo all' internodellafunzione,cisignificachesonovistesoloall'int ernodellafunzionestessa.Nel nostroesempiospecifico,lavariabilealtezzadelprogramma,NONlastessavariabiledialtezza usataall'int ernodellafunzione.Perchiarezzadelcodice,iousomettereunaPprimadeiparametri, una F prima delle variabili usate all'inte della funzione. Nel nostro esempio specifico avrei rno scritto: defAreaRettangolo(Plunghezza,Plarghezza,Paltezza): Farea=Plunghezza*Plarghezza*Paltezza returnFarea altezza=10 largezza=5 lunghezza=15 print' Ilrettangolohaunareadi',A reaRettangolo(lunghezza,largezza,altezza),'Me tri' Questanomenclaturanonobbligatoriasolounmiomododiprocedere

AppuntidiPython Sesidefinisceunvalorealparametro,ilparametrodiventaopzionale. Esempio: defAreaRettangolo(Plunghezza,Plarghezza,Paltezza=10): Farea=Plunghezza*Plarghezza*Paltezza returnFarea InquestocasoPaltezzaunparametroopzionale,quindisenonlopassoallafunzione,prendeil valoredi10 IModulisonofile.pychepossonoessererichiamatidacodicepython. Avevamodettoall'i nizio,chepythonhapocheistruzioni,(nondovrebberoesserepidi20).Questo potrebbefarcrederechepythonsialimitato,manoncos.Sisceltolasemplicit,invecedi centinaia di istruzioni si scelto pocheistruzioni (quindi maggior semplicit).Questo ha fatto nascereunamiriadedimodulifattidaterzi,perlagestionedelleproblematichepicomuni: accessoadatabase,gestionedeifile,gestionedelledate,stringheecc.. Questi moduli nonsonoaltro chefunzioni richiamabili dai nostriprogetti, tramitel'instruione z importnomemodulo.Chiunquepufarsiilpropriomoduloedimportarlonelprogettochevuole. Adessopensateallefunzionieaimoduli,sesiunisconoleduecose,visarsicuramentevenutaun idea:a llorapossofarmidellefunzioni,quellechepiuso,metterleinunmoduloeusarlesututtii progettichevogliosenzariscriverle...... ebbenes. Iomisonofattounmodulochiamatoutility.pyincuiinseriscolefunzionigeneralideimieiprogetti. Tornandoalnostroesempio,possiamometterelafunzione: defAreaRettangolo(Plunghezza,Plarghezza,Paltezza): Farea=Plunghezza*Plarghezza*Paltezza returnFarea inunfilechiamatoaree.py poinelnostroprogetto,chiamatoadesempiolezione.py potremmoscrivere: importaree altezza=10 largezza=5 lunghezza=15 print' Ilrettangolohaunareadi',a ree.AreaRettangolo(lunghezza,largezza,altezza),'M etri' Notare: importaree=importailmoduloaree.pyl' estensioneNONservescriverla aree.AreaRettangolo(lunghezza,largezza,altezza)=perrichiamareunafunzionedelfilearee,sideve specificare il nome del modulo + la funzione da chiamare. (per chi ha gi programmato con linguaggiadoggetti,avrgicapitoilperchsiutilizzaquestasintassi).

AppuntidiPython

Leggereescrivereinunfile
Adessovedremoleistruzionichepermettonodileggeescriveinunfile.Questeistruzioni,saranno utili,inseguito,perlacreazionedelnostroprimoprogramma. Perprimacosa,peroperaresuifile,necessarioilmodulosys,quindinelnostrocodicedovremmo inserire: importsys all' iniziodelloscript. Leistruzioniperaprireunfile open .Lasuasintassilaseguente: open('no efile','m m odalit') Lamodalitciindicainchemododeveessereaperto: w=scrittura(write) r=lettura(read) r+=Letturaescrittura Sescrivoopen(' agenda.txt' ),miapreilfileagenda.txtinmodalitdisolalettura. ,'r' L' istruzioneopenrestituisceunpuntatorealfile(perilmomentolochiameremopuntatore,main realtnoniltermineesatto).Essomoltoimportanteperchciconsenteleoperazionisulfile stesso,sevedeteleistruzionisotto,capiretelasuaimportanza: FileAgenda=open(' agenda.txt','r ') Nelcasosopravieneapertoinletturailfileagenda.txt,FileAgendadiventailpuntatorealfile. Noncisoffermeremomoltosull'uso deifile,vediamosololeistruzionipiusate: ScritturaPuntatoreAlFile.write(' stringadascrivere' ) ScritturadiunalistaPuntatoreAlFile.writelines(' stringadascrivere' ) LetturaPuntatoreAlFile.read() LetturadiunarigaPuntatoreAlFile.readline() OvviamentedovetesostituirePuntatoreAlFile,conilnomecheaveteassegnatoalpuntatore,infase diaperturadelfile. Unacosamoltoimportante chiudereilfile dopoleoperazionichevogliamofare(ecomunque primadellachiusuradelprogramma).L'ist ruzionechefaquestaoperazione: PuntatoreAlFile.close(). L' usodelleistruzioniinunprogramma,verrannovisteinseguito.Senonavetebenchiarocome funzionino,nonvipreoccupate,nellalezionesottovedreteunesempio.

Facciamoilnostroprimove rop rogramma,unagenda


Supponiamo divolerfareunagendachememorizzailnomeeilnumerotelefonicoinunfile. L'a gendadovressereingradodimemorizzareidate,ricercarliecancellarli.Almomentonon gestiremoicasidiomonimia.Iltuttodovrfunzionaredalterminale,quindiperilmomentoniente interfacciagrafica. Ilprogrammasarcompostoda: Unmendisceltachepermettedisceglierel'a zionedaintraprendere Uninterfacciaperl'inse rimento,incuisichiedeall' utente,ilnomeeiltelefonodainserire Uninterfacciaperlaricerca,incuisichiedeilnomedaricercare Uninterfacciaperlacancellazione,incuisichiedeilnomedacancellare Traimen,inserireipureunazionechemipermettelavisualizzazionedell'in teraagenda Useremoundizionario(trattatoprecedentemente)comearchivioinram,poisalveremoidati,su

AppuntidiPython richiesta,inunfileditestochiamatoagenda.txt. Divideremoilprogettoinduemoduli: FunzioniAgenda.py,contenentetutte le funzioni generichedi gestione dell' agenda (inserimento, ricerca,cancellazione) GuiAgendaTerminale.py,contenenteleistruzionidiinputeoutputsulterminale. Agendo in questo modo, in futuro, quando faremo l'int erfaccia grafica su gnome, genereremo semplicemente un nuovo modulo chiamato GuiAgendaGTK.py e RIUTILIZZEREMO, senza nessunamodifica,ilmoduloFunzioniAgenda.py.Inparolepovere,dividiamoil motore veroe proprio della gestione dell' agenda (FunzioniAgenda.py), dalla sua rappresentazione grafica (GuiAgendaTerminale.py e GuiAgendaGTK.py). Ho evidenziato la voce RIUTILIZZEREMO perchquestounconcettochedoveteaverbenchiaro:qualsiasicosafate,cercatedifarlainmodo chepossaessereriutilizzata.Perfarquestosidevonosempreusarefunzioniemoduli,benstudiati. Diseguito,vedremolefunzioniperinserimento,ricercaecancellazionedell' agenda. Iniziamodall'inserim ento. Perprimacosasideveaverbenchiaroqualisonoidatiimportanti,coinvoltidurantel'i nserimentoe comedeveavvenire.Cisono2datiimportantinell' inserimento:ilnomeeilnumerotelefonico. Questidati,abbiamodettochesarannomemorizzatiinundizionario,lacuichiavesarilnomeil cuivaloresarilnumerotelefonico.Quindi,lanostrafunzionedovrprendereiningressoilnome deldizionarioacuiaggiungereidati,ilnomeeiltelefono.Inomidellefunzioni,devonoessere 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: defAggiungiNumero(Agenda,Nome,Telefono): QuestalaprimarigadellafunzioneAggiungiNumero.Vediamolaneldettaglio: ilcomandodef(comeabbiamogivisto),serveadefinireunafunzione AggiungiNumeroilnomechenoiabbiamodatoallafunzione Quello che sta tra parentesi tonde, sono i parametri (i dati che noi daremo in pasto alla funzione) IlparametroAgendalalistacheglipasseremo(lalistacontienetuttal'agnda),Nomeilnomee e Telefonoilnumerotelefonicodainserire. Iduepuntifinali,sonoobbligatoriefannopartedellasintassidellefunzioni(enonsolo) Adessoscriviamoilresto: defAggiungiNumero(Agenda,Nome,Telefono): Agenda[Nome]=Telefono Ok,macomefunziona? Semplice,vengonopassati3valori.Agendailnomedellalistachecontienelalistadituttiinomi e i numeri telefonici, Nome contiene il nome della persona che vogliamo inserire nell'agnda, e Telefonocontieneilnumerotelefonicochevoglioinserire,associatoalnome. L' istruzioneAgenda[Nome]=Telefonononfaaltrocheaggiungerealdizionario,lachiaveNome edilvaloreTelefono.Vediamounesempio:

AppuntidiPython defAggiungiNumero(Agenda,Nome,Telefono): Agenda[Nome]=Telefono Agenda={} nomedainserire='Gi anni' telefonodainserire='1234567890' AggiungiNumero(Agenda,nomedainserire,telefonodainserire) L'e sempiosoprafunzionainquestomodo: Nelleprimeduerighevienedefinitalafunzione(equestoloabbiamogispiegato) Poivienedefinitoildizionariovuoto,chiamatoAgenda(tramiteAgenda={}) Successivamente,vengonodefiniteduevariabilistringa:nomedainserireilcuivalore'Gi e anni' telefonodainserireilcuivalore'1234567890'. Aquestopuntovienerichiamatalafunzione,passandoivalorinomedainserireetelefonodainserire, quindi(setorniamoavedereladefinizionedellafunzioneAggiungiNumero),difatto,ivaloridei parametridellafunzione(Nomee Telefono),diventanorispettivamente,'G ianni' 1234567890'. e' Adesso viene eseguita l' istruzione Agenda[Nome] = Telefono, che si trova all'i nterno della funzione.Questaistruzione,viene' tradotta' dalprogrammainquestomodo: Agenda['Gi anni'] = '1234567890', questoperch Nome='Gi e Telefono='098078897'. anni' Quindiilprogramma aggiunge la chiave ' Gianni'al dizionario Agenda, ed associa alla chiave 'Gi anni',il valore '1234567890'. Questapartesopramoltoimportantecapirlabene,quindiviconsigliodileggerlepivoltefin quandononvituttochiaro. ProceduradiCancellazione Fattalafunzionediinserimento,procediamocolfarelaproceduradicancellazione. Per cancellarei dati (nomeenumero), sufficienteavereil nome (inquanto nongestiamo le omonimie).Quindidovremofareunafunzioneche,passandoildizionarioedilvaloredellachiave 'Nom rovvedaacancellareilnomeedilnumerotelefonico.Laprocedurasemplice: e',p defCancellaNumero(agenda,Nome): ifagenda.has_key(Nome): delagenda[Nome] Questafunzioneusa l'i struzione has_key.Essaverificaselachiaveesiste,incasoaffermativo cancellalachiaveedilvalore,altrimentiavvisal'uten techeilnomenonpresentenell' agenda. Se,adesempio,sivuolcancellareilnome' Gianni'dldizionarioagenda,scriveremo; a CancellaNumero(Agenda,' Gianni') Lafunzionesopra,prendercomevaloredelparametroNome,ilvalore' Gianni'. Successivamente verificaseneldizionarioagendapresentelachiave' Gianni': ifagenda.has_key('Gi ):.Incaso anni' affermativo,cancellalachiaveedilsuovalore:delagenda[' Gianni'] ProceduradiRicerca Laricerca,inqualchemodo,simileallacancellazione.Ancheinquestocaso,dovremmopassare comeparametri:ilnomedeldizionarioeilnomedellachiavechesivuolcancellare. defCercaNumero(agenda,Nome):

AppuntidiPython ifagenda.has_key(Nome): return"NumeroTelefonico"+agenda[Nome] Nondifficilecapirechecosafalafunzione.... 1)verificasec' lachiave 2)Sepresenterestituiscelastringacontenenteilnumerotelefonico Funzionepervisualizzarel'interaAgenda Per fare questa funzione, sar necessario passare alla funzione, unicamente il dizionario. Successivamentedovremmoscorrerelechiavideldizionarioestamparneilnomeedilvalore. Inpratica: defMostraAgenda(agenda): print"AgendaTelefonica:" forxinagenda.keys(): print"Nome:",x,"\tTelefono:",agenda[x] print LafunzioneiniziaconlastampaavideodellascrittaA gendaTelefonica .Successivamente,con l'i struzioneforxinagenda.keys():,scorreeprelevatuttelechiavideldizionario.Perognichiave nestampailvalorecorrispondente(agenda[x]). Alcunidivoiavrannonotatounostranocarattere(\t),nell'i struzione: print"Nome:",x,"\tTelefono:",agenda[x] essoserveastampareunatabulazione.Inpratica,l'ist ruzionesoprastampa: Nome:+chiave+tabulazione+Telefono+valoredellachiave Esempio: Nome:Gianni Telefono:098078897 Funzioneperilsalvataggiodeivalorisuunfile Questagiunafunzionepicomplessa.Perprimacosa,dobbiamodecidereinchemodo(inquale 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? Semplicementeandremoascrivereinunfileinostridati(nomeenumerotelefonico),separatidaun carattereanostrascelta.Ingenere,quandosieseguonosalvataggidiquestogenere,comeseparatore di campo viene scelto un carattere non usato nei dati: assurdo, ad esempio, scegliere come separatoreunalettera,poichcreerebbeconfusionee,inmoltesituazioni,nonsiriuscirebbepia capire,dovefinisceilcampostesso.Normalmente,comeseparatore,vieneusatouncaratteredi punteggiatura(olavirgolaoilpuntoevirgolaecc..).Qualcunodivoi,potrebbeobbiettareche anchequestopugenerareconfusioneneicasiincui,lapunteggiaturapresenteanchenelcampo. Incasicomequesti,siusamettereicampitraidoppiapici. Nelnostrocasospecifico,siamodifronteanomienumeritelefonici.Inentrambiicasi,ilpuntoe virgolanonsarmaipresenteinnessunodeiduecampi,quindilouseremocomeseparatoredi campo.Ilformatodelnostrofile,sar: Nome;Telefono+ritornoacapo Nome;Telefono+ritornoacapo ecc...

AppuntidiPython Spiegatopidettagliatamente,abbiamoscelto(perconvenzionenostra),disalvareidatiseguendo laseguentesintassi: Nome+separatore(nelnostrocasoilpuntoevirgola)+Numerotelefonico+ritornoacapo Nellafunzioneprecedente,avevamovistocom' possibilestampareunatabulazione.Nellostesso modo,pertornateacapoinunfilesidevestampareuncarattereparticolare:\n Quindi,perlaprecisione,nelnostrofiledovremmoscrivere: Nome+puntoevirgola+Telefono+\n Nome+puntoevirgola+Telefono+\n ecc... Vedendounesempioconcreto,nelnostrofilecipotrebberoesseredatidiquestogenere: Gianni;12345678\n Panther;7654321\n ....eviadicendoperogninomeregistratoinagenda. Iniziamoacrearelanostrafunzionedisalvataggiodati.Perprimacosascegliamounnomeadatto: qualemiglionomediSalvaAgenda? Adessopensiamoaiparametridapassareallafunzione.Sicuramentedovremmopassaretuttiidati, quindi, nel nostro caso, potremmo passare l'int dizionario. Altro parametro importante e ero indispensabileilnomedelfileincuivogliamosalvareidati. Quindi: defSalvaAgenda(agenda,NomeFile): ....elanostrafunzionedefinita. Laprimacosachedovremmofarenellafunzioneaprireilfileincuiscrivereidati.Seviricordate bene,peraprireunfilesononecessarieduecose: 1)Includereilmodulosys,quindi,nelnostroscript,dovremmoscrivereim portsysal l' inizio 2)dovremmousarelafunzioneopenperaprireilfile Quindi: out_file=open(NomeFile,"w") L' istruzionesopra(comeabbiamogivisto),apreunfile,ilcuinomecontenutonellavariabile NomeFile,inmodalitdiscrittura( w )eciriferiremoalfilestesso,tramiteout_file(quindile istruzionidiscritturariguardantiquelfile,dovrannoesserescritteinquestomodo:out_file.write ecc..) Adessoabbiamoapertoilfileinscrittura.Prossimopassolascritturadeidati.Inostridatisono contenuti in undizionario.Abbiamodettocheidizionarisonounaspecialelistacontenente la chiaveedil suovalore.Senoiestraiamolechiavi,saremmoancheingradodiavereilvalore corrispondente.Seusiamol' istruzioneforabbinataallafunzionekeysdeidizionari,riusciremmoad estrarretuttelechiavi.Adognichiaveestratta,saremoingradodiestrarreilvaloredaldizionario Agenda,riferendociallachiave(es:agenda['Gi ]). anni' Quindi: forxinagenda.keys(): out_file.write(x+","+agenda[x]+"\n") Proviamoatradurreinlinguaggioumano,leistrizionisopra: LinguaggioPython> For xin agenda.keys() TraduzioneItaliano> Perogni valoredixtra lechiavidell' agenda

AppuntidiPython Perognichiavedell'a gendatrovata,lavariabilexdiventaugualealnomedellachiave. L' istruzionesuccessivapotrebbeesseretradottainquestomodo: LinguaggioPython> out_file.write (x+";"+agenda[x]+"\n") TraduzioneItaliano> Scrivinelfile Il nome della chiave (x), poi aggiungi il punto e virgola,poiaggiungiilvaloredeldizionarioagenda,la cuichiavex,poivaiacapo(\n)

Ilgiochettodellatraduzionemiservitoafarvicapireduecose: 1)Pythonusadelleistruzionisempliciechiare 2) Cercate sempre di capire cosa fa il codice. All' inizio difficile, ma poi riuscirete a capire esattamentecomefunzionanolevarieistruzioniedimpareretealeggereilcodice. Estrattituttiidatidaldizionario,cirestasolounacosadafare:chiudereilfilestesso. Quindi: out_file.close() Adessovediamol'inte rafunzionediscritturasufiledeidati: defSalvaAgenda(agenda,NomeFile): out_file=open(NomeFile,"w") forxinagenda.keys(): out_file.write(x+","+agenda[x]+"\n") out_file.close()

Funzionepercaricamentodeivaloridalfile Sevogliamocaricarelanostraagenda,dovremmo: 1)Aprireilfilecontenentel' agenda 2)Leggereunariga 3)leggerelachiaveedilvalore(es:Gianni,12345) 4)Creareunanuovachiavesuldizionarioedassegnargliilrispettivovalore(es: agenda['Gi ]='12345 ) anni' ' 5)Ripeteretuttodalpunto2,finquandononfinitoilfile Adesso partiamo in modo traumatico :) Scriver prima la funzione che fa il tutto e successivamentelaspiegheremo. Lafunzionecheleggeidatilaseguente: defCaricaAgenda(agenda,NomeFile): in_file=open(NomeFile,"r") while1: in_line=in_file.readline() ifin_line=="": break in_line=in_line[:1] [Nome,Telefono]=string.split(in_line,";") agenda[Nome]=Telefono in_file.close()

AppuntidiPython Indubbiamente,inquestafunzione,cisonoparecchienovit chemeritanodiesserespiegatein mododettagliato. Lacosache visarsicuramentebalzataagliocchi,unusostranodell'ist ruzionewhile.Sevi ricordate,l'ist ruzionewhile,ripeteunaporzionedicodicefinquandolacondizioneavverata. Esempio: whilelunghezza<=0: significa,ripetiilcodicefinquandolalunghezzaminoreougualeazero. Nelnostrocasoabbiamoscritto: while1: qualcunosisarchiesto: malacondizionedov' ? Inrealtquelwhilehaunacondizionechesemprevera,quindiilcodicesottostantesarsempre eseguito.Questotipodiripetizioneinfinitadettol oopinfinito. Nellarealt,quellononproprio infinito,inquantovieneinterrotto,aduncertopunto,daunistruzionebreak(guardatequalcheriga sotto).Quindinededuciamochepossibileusciredaunlooptramitel'ist ruzionebreakche lo s pezza . Altras trana istruzionequesta:in_line=in_line[:1] Ilsuosignificatosemplice: assegnaallavariabile in_line,ilsuostessovaloremenol'ultimo carattere.Neldettaglio,l' istruzionein_line[:1]significat uttiicaratteridalprimoalpenultimo. Seavessiscrittoin_line[2:5]sarebbesignificato tuttiicaratteridalsecondoalquinto .Percapire meglio,guardategliesempisotto:
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'

Tornandoalnostroprogramma,l'istruionein_line=in_line[:1],difattoeliminal' z ultimocarattere. Vichiedereteperch?Semplice,sevediamoilnostroformato:


nome+;+telefono+\n

risultachiarocheilritornoacapo(\n)ciservivanelfile,manonlovogliamostampare,quindilo eliminiamo. Eadessovediamol'ultim aistruzionenuova:[Nome,Telefono]=string.split(in_line,";") Sembracomplicata,mailsuosignificatosemplice: lastring.splitunafunzionechecipermettedi catturare delleporzionidistringhe,separatedaun carattereanostrascelta.Neldettaglio:string.split(in_line,";")significa taglialastringaneipunti separatidalpuntoevirgolaedammiivaloristringa . Setorniamoavedereilnostroformato(senzailritornoacapo):nome+;+telefono,avreteginotato chenoiabbiamobisognodiestrarreilnomeeiltelefono.Iduevalori(perconvenzionenostra), sonoseparatidaunpuntoevirgola.Lafunzionestring.split(in_line,";")fapropriocicheservea noi.Lasintassilaseguente:

AppuntidiPython string.split(variabile_contenente_i_valori,"carattere_separatore_di_testo"), nel nostro caso specifico:string.split(in_line,";") Lasintassi[Nome,Telefono]=string.split(in_line,";")significa: dopoaverestrattoivaloridinome ecognome,assegnaliallevariabiliNomeeCognome. ATTENZIONE!! L' istruzionestring.split,fapartediunaseriedifunzionidedicateallestringhe.Perusarequeste funzioninecessarioinserireimportstringall'ini ziodelloscript Sperochelaspiegazioneall'int erafunzione,nonviabbiad emolito :) Facciamounriassunto: defCaricaAgenda(agenda,NomeFile): in_file=open(NomeFile,"r") while1: in_line=in_file.readline() >definiscolafunzioneedisuoiparametri >aproilfilecontenentel' agendainlettura >creounloop,finquandocisonodatidaleggere >leggounalineadelfileeassegnoilcontenutoalla variabilein_line ifin_line=="": >controlloselavariabilein_linevuota,allorailfile statolettotutto break >selacondizionesopraveraescidalloop in_line=in_line[:1] >eliminadallastringa,ilritornoacapo(\n) [Nome,Telefono]=string.split(in_line,";")>leggiidatinomeetelefonoedassegnaivalori allevariabiliNomeeTelefono agenda[Nome]=Telefono >inseriscilachiaveedilvaloreneldizionario in_file.close() >Chiudiilfile Bene,studiatevibenelelineesopraecercatedicapireilsignificatodiognilinea. Adessononcirimanecheduecosedafare: 1. Creareunpo'dic odicecheutilizzilefunzioni 2. Creareunasortadimencheindichiall'ut ente,leazionichepufare. Ilmen,possiamofarlo,creandounasemplicefunzionechestampiavideolepossibiliazioniche l'ute ntepufare.Nonvistaraspiegareneldettagliolafunzione,velapropongosotto,machiaro cichefa: defprint_menu(): print' AGENDA' print' 1.MostraAgenda' print' 2.Aggiungiunnuovonumero' print' 3.Cancellaunnumerotelefonico' print' 4.Cercaunnumerotelefonico' print' 5.CaricaAgenda' print' 6.SalvaAgenda' print' 7.Esci' print' '

AppuntidiPython Adessouniamoiltuttoconilveroeproprioprogramma: Ilnostroscopoquellodipermetteredieseguiredelleazioni,allapressionedicertitasti.Esempio: sel'ut entepremesu1,dovresseremostratal' agenda,sepremesu2,dovresseraggiuntounnuovo numeroeviadicendo.Leazionisarannoinseritetramitel'ist ruzioneinput.Condegliif,andremoa controllarecichel'ut entehapremuto,e,secondolesceltefatte,sarannointrapresedelleazionie richiamatedellefunzioni.Nelcodiceuseremol' istruzione elif essautilizzatainabbinamentoad if,inItaliano,potrebbeesseretradottain altrimentise. L'i struzioneifunitaadelif,permettedi crearedellescelteannidiate....struttureparticolarichesvolgonoazionitipo: se a ugualea b faiquesto altrimentise a ugualea c faiquesto altrimentise a ugualea d faiquesto .....ecosvia Ricordateunacosa,iconfrontisiscrivonoinquestomodo: inItaliano seaugualeabco npython ifa==b( notareidueuguali!!) inItaliano seamaggioredibco npython ifa>b inItaliano seaminoredibc onpython ifa<b inItaliano seamaggioreougualeabc onpython ifa=>b inItaliano seadiversodabconpyt honi fa!=b Adessoavetetuttoilnecessariopercapirecomefunzional'int eroprogramma,quindiviscrivosotto l'i nteroscript,veloguardate,loprovateecercatedicapirecomefunziona.Soprattutoilcodice finalechenonvihospiegatoneldettaglio,machedovresteessereingradodicapire,conunpo' di sforzo,comefunziona. Ilconsigliochevidoquellodistamparviilcodice,eseguireilprogrammaestudiaresulcodice comefunzionaalverificarsidellesceltedell'ut ente. Nella prossima puntata inizieremo ad usare Glade, successivamente separeremo il codice dell' agendadallasuarappresentazionevisivaecreeremoilprogrammaperglade. Buonlavoroebuonstudio. Codice completo (salvate con il nome di agenda.py ed eseguitelo con l'istruione python z agenda.py). ATTENZIONE!!! E' possibilecheletabulazionivadanoriscrittealtrimentipythonsiarrabbia: importsys importstring defMostraAgenda(agenda): print"AgendaTelefonica:" forxinagenda.keys(): print"Nome:",x,"\tTelefono:",agenda[x] print defAggiungiNumero(agenda,Nome,Telefono): agenda[Nome]=Telefono

AppuntidiPython defCercaNumero(agenda,Nome): ifagenda.has_key(Nome): return"NumeroTelefonico"+agenda[Nome] else: returnNome+"nontrovato" defCancellaNumero(agenda,Nome): ifagenda.has_key(Nome): delagenda[Nome] else: printNome,"nontrovato" defCaricaAgenda(agenda,NomeFile): in_file=open(NomeFile,"r") while1: in_line=in_file.readline() ifin_line=="": break in_line=in_line[:1] [Nome,Telefono]=string.split(in_line,";") agenda[Nome]=Telefono in_file.close() defSalvaAgenda(agenda,NomeFile): out_file=open(NomeFile,"w") forxinagenda.keys(): out_file.write(x+";"+agenda[x]+"\n") out_file.close() defprint_menu(): print' AGENDA' print' 1.MostraAgenda' print' 2.Aggiungiunnuovonumero' print' 3.Cancellaunnumerotelefonico' print' 4.Cercaunnumerotelefonico' print' 5.CaricaAgenda' print' 6.SalvaAgenda' print' 7.Esci' print' ' DizionarioNumeri={} SceltaMenu=0 print_menu() whileSceltaMenu!=7:

AppuntidiPython SceltaMenu=input("Menu(17):") ifSceltaMenu==1: MostraAgenda(DizionarioNumeri) elifSceltaMenu==2: print"Aggiungiunnomeeilnumerotelefonico" Nome=raw_input("Nome:") phone=raw_input("Telefono:") AggiungiNumero(DizionarioNumeri,Nome,phone) elifSceltaMenu==3: print"RimuoviilNomeeilrelativotelefono" Nome=raw_input("Nome:") CancellaNumero(DizionarioNumeri,Nome) elifSceltaMenu==4: print"Ricercailnumerotelefonico" Nome=raw_input("Nome:") printCercaNumero(DizionarioNumeri,Nome) elifSceltaMenu==5: NomeFile=raw_input("Nomedelfiledacaricare:") CaricaAgenda(DizionarioNumeri,NomeFile) elifSceltaMenu==6: NomeFile=raw_input("Nomedelfiledasalvare:") SalvaAgenda(DizionarioNumeri,NomeFile) elifSceltaMenu==7: pass else: print_menu()

AppuntidiPython Checos' Glade Gladeunostrumentochepermettedidisegnareinmodovisuale,lefinestreetuttiicomponenti contenutiinessa(caselleditesto,pulsanti,griglieecc...).IprogettigeneratidaGlade,sonofattiper funzionare conlelibrerieGTK.QuestelibreriesonoallabasediGnomestesso.Esso scritto basandosi suqueste:ognifinestra,pulsante,label ecc...diogniprogrammaGnomeelostesso desktopmanager,funzionanograziealleGTK. Gladenonunprogrammascrittoperillinguaggiopython;essonongeneracodicepython.Glade fattopergenerarecodiceCeC++,quindiunambientedisvilupponatoperfacilitarelosviluppo conquestiduelinguaggi.Inrealt,essohaunacaratteristicamoltointeressantechelorendeadatto perlosviluppodiapplicazioniconaltrilinguaggiquali:php,ruby,pythonecc..:iprogettifatticon glade,vengonosalvatiinxml. Non scenderemo nel dettaglio di che cos' un file xml, diciamo solo, in modo molto molto approssimativo,cheunfilexmlunaspeciedihtlmmoltoparticolare(perchivolesseapprofondire pufacilmentecercareinformazionionline).Inquestofilexml,Gladescrivetutteleproprietdella finestraodellefinestredisegnate,ediognielementochelocompongono. Abbiamoparlatodiproprietdellafinestraediognielemento,machecosasonolepropriet? Possiamosemplificaredicendocheleproprietsonopropriolecaratteristichedell' elemento.Per fareunesempio,lefinestrehannomoltepropriettracui:l' altezza,lalarghezza,laposizione,il titolo,ilnome,lospessoredelbordoecc... Python, non fa altro che leggere il file xml, creato da Glade, e generare la finestra e i suoi componenti, con le propriet contenute nel file stesso. Tutto questo avviene grazie al modulo PyGTKeallalibreriaLibglade.Sevoleteapprofondiremegliol' argomento,circailfunzionamento tecnicodeltutto,virimandoaquestolink:http://www.daa.com.au/~james/software/pygtk/ FinoadoraabbiamoparlatodiPython,GTK,GnomeeGlade,maleapplicazionifatteconquesti strumenti generano poi applicazioni multipiattaforma? La risposta s se si seguono certe condizioni(perlomenosuwindowselinux....forseanchepermacOSX,manonconoscendoquesto SO,nonnesonosicuro,sequalcunohainfoinproposito,sareigratosemiinformasse.Stessacosa perBeos). Lo sviluppo verr fatto su linux (ma nulla vieta che voi utilizziate Glade per windows), ma l' applicazioneprodotta,girersiasulinuxchewindows.

AppuntidiPython PrimoincontroconGlade AlsuoprimoavvioGladepresenta3finestre:Glade,PalettaePropriet. Vediamoespieghiamochecosasonoeacosaservono. FinestraGlade La finestra Gladela finestraprincipaledelprogramma,sesichiude,sichiudeil programma stesso.Essasipresentacomenellafigurasotto(ovviamenteipulsantipossonovariaresecondoil temadiGnomeusato):

Lafinestradivisain4parti: 1. Barradeimenu(quellainaltodovec' scrittoProject,Modifica,Visualizzaecc...) 2. Barradeglistrumenti(Nuovo,Apri,Salvaecc...) 3. Unriquadrobianco(ilcuiutilizzolovedremoinseguito) 4. UnaBarradistato(quellaincuiscritto Nuovoprogettocreato.),incuivengonostampati messaggieavvisi Adessospiegheremochecosesignificanoalcunimen. ATTENZIONE!!! NONpremetesuipulsantichespiegheremoora: perilmomentolimitateviaseguiteiltesto, successivamenteinizieremoadusareGladeecichesispiegato ConilpulsanteNuovo(oppuredalmenProject/Nuovo)possibilecreareunnuovoprogetto.Per progetto si intende una o pi finestre e i suoi componenti (pulsanti, etichette(label), caselle di inserimento testo ecc...). Tornando all' esempiodella nostra agenda, il progetto, potrebbe essere compostodaunafinestraalcuiinternoc' unacasellatestoperlericerche,unpulsanteeduna grigliachemostratuttal' agenda. IlpulsanteApri(oppureilmenProject/Apri),cipermettediaprireunprogettoprecedentemente salvato. Ilpulsantesalva(oppureilmenProject/Salva),cipermettedisalvareunprogetto,comeabbiamo vistoinprecedenza,inxml Ilpulsanteopzioni(oppureilmenProject/Options...),cipermettediimpostareleopzioniperil nostrospecificoprogetto

AppuntidiPython IlpulsanteCreaeseguibile,nonloutilizzeremomaipoichspecificoperillinguaggioCenon servenelcasodipython Nellabarradeimenpresente Modifica, essoilclassicomenincuisonopresentiicomandi dicopia,incolla,tagliaedelete(elimina). E'interessante vedere il men V isualizza . Esso ci permette di scegliere gli strumenti che vogliamovisualizzareinglade,seloaprite,notereteduecasellespuntate:MostraPalettaeMostra editordellepropriet.Provateadeselezionarelevocipercapireacheservono,poirimettetelicome sonoinmododaaverel' ambienteGladeugualealmioeprocedereinsiemediparipasso. IlmenImpostazioni,cipermettediimpostareilnostroeditor.Lovedremomeglioneldettaglioin seguito,sarebbeinutilespiegarloora PerultimoabbiamounmenA iuto ...facileintuirechequestomencontienelaguidaaglade FinestraPaletta All' aperturadiGlade,sisonoaperteanchealtreduefinestre,unadiquestelafinestraPaletta(vedi figurasotto). Comepotetevedere,essadivisaintreparti: Nellapartealta,c' unpulsante Selettore ,essocipermettedipassare inmodalitselezione(capiretemeglioinseguitochesignifica) Poi abbiamo 4 pulsanti: GTK+ Basic, GTK+ Additional, Gnome e Deprecated(nellafiguranesonopresentisolo3) Nella parte bassa, abbiamo tutta una serie di icone. Ogni icona rappresentauntipodicontrollochesi puaggiungerenellafinestra. Esempio: l'i rettangolare in cui scritto ab| (la seconda della cona seconda riga), ci permette di creare un campo di immissione nella finestra. Come si pu vedere dalla figura, in questo specifico caso attivato il pulsanteGTK+Basic,quindivengonomostratituttiicontrollidibasedella libreriaGTK.....inparolepovereleiconerelativeaicontrolliinseribilinella finestra(partebassadellafigura),sonoquellidibase(Basicappunto). Se premo su GTK+Additional, vengono mostrati i controlli addizionali, utilizzabilinellefinestre,stessacosaperilpulsantegnomeedeprecated. Nelnostrocasospecifico,abbiamobisognodicompatibilitconwindows, quindieviteremodiusarecontrollispecificidiGnome(pulsanteGnome)e controlli strani per l' ambiente windows (GTK+ Additional). I controlli Deprecated,nonliutilizzeremoperch,sottoquestavoce,vengonoinseriti controlliconsiderativecchi.Ebbenes,nellenostrelezioniutilizzeremosolocontrollipresentisotto GTK+Basic.Comunquequesticontrollisonopichesufficientiacrearetutteleapplicazioniche desideriamo.

AppuntidiPython FinestraPropriet Adessovediamol'ultim afinestracheabbiamonelvideo,lafinestraPropriet, visibileinfigura sotto. Chistatoattento,avrgiintuitoacosaservequestafinestra. Essa ci permette di impostare le propriet di ogni singolo componentedellafinestradelprogettoedellefinestrestessedel progetto. Ricordiamo che ogni componente ha delle propriet (es:lunghezza,altezza,bordoecc...).Essohaancheunasezione chiamataS egnali chemoltomoltoimportante,direicheil motore indispensabilealfunzionamentodelprogrammaveroe proprio.Inseguitovedremomegliodichecosasitratta.

PrimipassiconGlade AdessolapanoramicadiGladestatafatta.....direichepossiamopassareall' azione,iniziandoa fare qualcosa di veramente semplice: una finestra con 3 pulsanti (inserimento, cancellazione e ricerca),duecasellediinserimentotesto(nomeetelefono)e2label(Lelabelsonoetichette,cio scritteingenerestatiche). Primo passo da fare premere sul pulsante Nuovo (o dal men Project/Nuovo), apparir una finestraugualeaquellasotto:

Primoproblema:checosasidevescegliere? Larispostasemplice,noivogliamocreareunprogettofunzionanteconlelibrerieGTK+,siasu Gnome che su windows, quindi premiamo sul pulsante N ew GTK+ Project , per creare un programmagenerico,funzionanteconlelibrerieGTK+. Adessocreiamolafinestraincuiinseriremoilpulsante: dallafinestra Paletta ,premeresulpulsante GTK+Basic, poisullaprimaiconadeicomponenti (laprimaiconainaltoadestra,quellasopral'i conaA,giustoperesserechiari).Seciandatesopra, viverrmostratalaguidaconlascrittaFin estra .

AppuntidiPython Appenaavetepremutosull'i conaFin estra ,verrmostrataunafinestracomequellasotto:

Quellasarlafinestradelnostroprogetto,quellaincuiandremoadisegnareipulsanti,leetichette ecc... ATTENZIONE!! Daadessoinavanti,chiameremo,leiconesullafinestraP aletta, conilnomediC omponenti o widget.Quindicicheabbiamofattoora,statoquellodipremeresulcomponente(owidget) Fin estra delgruppoGT K+Basic Notiamosubitoalcuniparticolari: LafinestraGladecambiatainquestomodo:

Inquellacheprimaeraunareabianca,adessoc' lascrittaw indow1. Inquest' areaverranno elencatetuttelefinestredelprogetto.E' utileperpassaredaunafinestraall' altradelprogettoinfase di disegno, nelcasoil nostroprogrammafossecompostodapifinestre.Adessofateunclick proprioinquest' area,incorrispondenzadellascrittawindow1odellasuaicona.

AppuntidiPython

GuardiamolafinestraProprietcom' cambiata.Dovrebbeesseregrossomodocomequellasotto: Il titolo della finestra a fianco dice Propriet: window1, infattiquellechevedetesonoleproprietdellafinestrache avete creato. Cerchiamo di capire che cosa sono queste proprietneldettaglio(vedremosololeproprietpiusate) Nome >ilnomedellafinestra(danonconfondereconil titolo!!).E' ilnomediriferimentocheverrusatodapython perriferirsiaquellafinestra. Class>difficilespiegarvichecosasignificaClass,senon avete concetti di programmazione ad oggetti. Per farvela breve, diciamo che Class ci indica a che gruppo di componentiappartiene.Tuttiicomponenticheappartengono allo stesso gruppo, anche se hanno nomi diversi, hanno propriet identiche. Se create una nuova finestra, essa apparterrsempreallastessaClasse.Inseguito,vedremoche cichec' scrittonellacasellaClass,potressereutile.NON VARIATECIO' CHEC'E' SCRITTO!! SpessoreBordo >lospazio,inpixel,cheintercorretrailbordoedicomponenti(provatead aumentarloeguardatecomevarialafinestra,poiriportatelosuzero) Titolo>E' iltitolochecomparesullafinestra,cambiamoloescriviamo LamiaPrimaFinestra . Notatecichesuccedeallafinestra Posizione >Indicaincheposizionesidevetrovarequandovienevisualizzataperlaprimavolta (all' avviodelprogramma).CambiamoilvaloreescegliamoC enter. L' effettononlovedetesubito, madurantel'e secuzionedelprogrammapythonchelarichiama. Resizable >Indicasevogliamochelafinestrapossaessereridimensionatadall'ut ente.Lasciamo S. Icona>Indical' iconadaassociareallafinestra.Lasciamovuoto AdessoprovateapassaresullascrittaNome,Class,Titoloecc...soffermandoviqualchesecondosu ogniscritta.Noteretechevivienerestituitounsuggerimentocheviaiutaacapirechecosasignifica quellapropriet.

AppuntidiPython

Vediamoanchealcuneproprietdiwindow1,sullalinguettaCommon: Larghezza>Indicalalarghezzaminimadellafinestra.Nel casolafinestrasiaridimensionabile,quelloillimiteminimo relativoallalarghezza.Nelnostrocasodisattivato,quindi nonesisteunalarghezzaminima. Altezza>Comesopramarelativoall' 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' esperienzapoicapireteperch) Suggerimento > il suggerimento che volete mostrare, quandol'ut entepassasullafinestra.

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(operlomenoNONcorretto),inserireicomponentidirettamentesullafinestra,poich lafinestraaccettaunsolocomponente(widget).Quindi,primaditutto,dovremmoinserireunoo pispecialipannellichiamatisizers,adibitialposizionamentodeicomponenti.Attraversoisizers possibilecreareunastrutturasimileatabelle,incui,ognisingolacella,puo spitare unsolo widget (componente). E'buona norma pensare precedentemente a come deve essere la nostra interfaccia,questopermetteunafacilesceltadeisizerdautilizzare. Quando realizzate un nuovo programma, prima di disegnare la finestra o le finestre che lo compongono,buonanormadisegnarlesuunfoglio,omeglioancoraattraversodeiprogrammi. Nonimportantedisegnareildettagliodellafinestra,maunprototipo,inmododaaverchiaroche cosasivuolottenereinfasedidisegnoconglade.

AppuntidiPython Isizerschepossiamoutilizzaresonoquelliindicatidallefreccie

Ogniunohalepropriecaratteristiche,ipie leganti sonoiprimi3(per tuttaunaseriediragionichenonvistaradire),mal'u ltimo(Posizione Fissa)ilpisemplicedausare.Essosupportapicomponentisudiesso, ed un posizionamento tramite il trascinamento del componente stesso. Quindiuseremoproprioquelcomponente.Primadiprocedere,guardatela finestra,ilsuointernocompostodarigheobliqueincrociate.

Premetesulcomponente PosizioneFissa, poifateunclickall' internodellafinestraenotatecom' variata: Adessoalsuointernocompaionounaseriedi puntini, quelli sono la nostra guida per posizionareglioggetti. Andate sul Menu Impostazioni della finestra Glade e vediamo i men che ci vengonoproposti: MostraGriglia>permettediattivare e disattivare la griglia (provate a farlo e guardatechesuccede) SnaptoGriglia>Significasevogliamo cheicomponentiinseritisispostinosolo suipunti Impostazioni Opzioni Griglia > Indica quantofittadev' esserelagriglia Adessoprendiamouncomponenteeposizioniamolosullafinestra: 1. PremetesulcomponentePulsante(Ilprimodellaterzariga,quelloconscrittoOK) 2. Spostatevisuunpuntoall'in ternodellafinestraepremetesulpulsantesinistrodelmouse

AppuntidiPython Cicheotterretequesto: Lavostraprimafinestraconunpulsante.Adessopremetesul pulsanteedandateavedereleproprietdiesso.Notereteche alcuneproprietsonougualiaquelledellafinestra,mentrealtre sono differenti o nuove. Da ci si deduce che le propriet varianodacomponenteacomponente.

Adesso andate sul menu Vi sualizza e premete su Mostra albero dei widget. Apparir una finestracomequesta: Questavivisualizzalalistadeicomponenti(widget)usatiela loro gerarchia, vi permette inoltre, di selezionarli in modo rapido. Nelnostrocaso,vediamocheabbiamounafinestrachiamata window1 , all'i nterno di essa c' un pannello fixed1, sul qualepresenteunbottoneb utton1. Adesso provate a cliccare su ogni singolo componente e guardate che succede. Notate che alla selezione di un componente,corrispondelavisualizzazionedellesuepropriet e la selezione nella finestra. Avrete senza ombra di dubbio capitol'u tilitdiquestafinestra.Soprattuttosecisonomolti componentiefinestrechecompongonoilprogetto. Sevogliamocancellareuncomponenteinserito,bastaselezionarloepremeresultastoCa nc o D el .Proviamolosubitocancellandoilpulsante. Loscopodelnostroprogrammaquellodigestirelanostraagenda.Quindidovremmoinserire almenotrepulsantipergestirelaricerca,l'ins erimentoel' eliminazionedinomietelefoni.Esistono duecomponenticheciaiutaagestiregruppidipulsanti,unoperpulsantidispostiinorizzontalee unopergruppidipulsantiverticali.Essisono moltocomodiperchraggruppanoipulsantiad intervalliregolarieliallineano.Noiutilizzeremopulsantiorizzontali.

AppuntidiPython

Creagruppodipulsantiorizzontali(barraorizzontale)

Creagruppidipulsantiverticali(barraverticale)

Premiamosulcomponentepergruppipulsantiorizzontali,successivamentealcentrodellanostra finestra.Gladecichiederquantipulsanti(colonne)sivuolinserire,inseriamo3epremiamosuOK. Quellocheotterremovisibilenellafigurasotto: Adesso abbiamo inserito i tre pulsanti, ma dobbiamocambiarelascrittasulpulsante: ilprimopulsantedevediventare Ricerca ilsecondopulsantedevediventare Inserisci ilterzopulsantedevediventare Elimina Per fare questo, dobbiamo selezionare ogni singolo pulsante ed andare sulle propriet per cambiarelascritta. Procediamoinsieme: 1. fateunclicksulprimopulsante. 2. andaresullafinestra propriet. 3. nellapropriet etichetta, variatecichec' scrittoconlascrittaRi cerca .Mentrevariatela scritta,noteretecheanchelascrittasulpulsantevaria. 4. direidiassegnareancheuniconaalpulsante,perfarci,andatenellaproprieticona,premete sullafrecciaperaprirelalista(combobox),viapparirunaseriediiconedascegliere.Scegliete l'ic onaT rova . 5. aquestopunto,c' ancoraunacosamoltoimportatedafare, assegnareunnomealpulsante. Questaoperazione moltoimportante,ilnomedelpulsante,ciservirnelcodicepython,per riferirciaquelcomponentespecifico.Ilnomenondeveesseremaicasuale!!!.Ingenereioscelgo unnomecheneidentifichiiltipodicomponenteel' azionechedevesvolgere.Nell' esempio specifico,ilcomponente(witget)unpulsanteel'a zionechesvolgeinserireunnomeedun numerotelefoniconellanostraagenda;quindiunnomepossibilepotrebbeessere Bt_Ricerca (abbreviazionediBottonediricerca).Ilnomedeveesseremessonellapropriet Nome ,quindi sostituitequellochec' scritto,con Bt_Ricerca . 6. Ultimacosachepossiamofareperabbellireiltutto,mettereunbelsuggerimentoperl' utente. Andate nella linguetta C ommon, nella sezione s uggerimento inserire R icerca il nome

AppuntidiPython all' interno dell' achivio. Adessoandatecolmousesulpulsante,fermatevieguardateciche appare. 7. Adessoripetiamoipuntida1a6,perilsecondoeterzo.Essidovrannoavererispettivamentela scritta Inserisci e Elimina, l'i cona Aggiungi e Elimina , i loro nomi saranno Bt_I nserisci eBt_El imina eneisuggerimentisarinseritoAgg iungeilnuovonumero e Eliminal' utentedall'a genda (guardatelanotasottoprimadiprocedere) ATTENZIONE!!! Avretenotatocheall'in ternodelpulsantepossibileselezionareognisingoloelementochelo compone(immagineescritta),quellochenoivogliamofareconsiderarel' interobottone.Se selezioniamosolol'im magine,vedremo SOLO leproprietdell' immaginestessa,cichenoi vogliamovariare,sonoleproprietdelpulsante.Perselezionarel'inte robottonedovetepremere nelsuobordooancorameglio,utilizzatel' alberodeiwidgetperselezionareicomponenti,cos nonavreteproblemi(menuvisualizza,mostraalberodeiwidget) NONvipreoccupateseipulsantisisovrappongono

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,sespostiamolabarra,spostiamotuttiipulsanti.Perquantoriguardalasovrapposizione, evidentechequestadipendedalfattochelabarratroppopiccola.Correggiamoquesteduecose, procedendocomesegue: Visualizzatel'a lberodeiwidget(dalmenvisualizza).

Selezionarelabarra(hbuttonbox1),comeinfigura.

p.s. Notatelagerarchiadeglioggetti,ipulsanti,comesipuvedere, stannoall'inte rnodellabarra

Adesso andiamo avederele propriet dellabarra(PRESTATE ATTENZIONE): noi dobbiamo ampliare la barra, avrete sicuramente notato la propriet dimensione in cui scritto 3. La traduzioneinItalianodiquestaproprietunpo' forviante,essainfatti,siriferiscealnumerodei pulsantipresentisudiessa(treappunto)enonalledimensionifisiche.Ledimensionidellabarra,si trovano,selezionandolalinguettaCommon,incuipresentelaproprietlarghezza.Aumentiamola

AppuntidiPython larghezza, in modo da creare ampi spazi tra i pulsanti. Fatto questo, selezioniamo la barra, premendoinunospaziovuototraunpulsanteedun' altroetrasciniamolaalcentro,inbassodella finestra.Vedifigurasotto:

Perselezionareospostarelabarra preminellospaziovuototraun pulsanteel'al tro

Adessodobbiamoinserireunacaselladi inserimentoditesto incuil' utenteinseririlnome,ed unaincuiverrannoinseritiovisualizzatiinumeritelefonici. Ormaisieteingradodifarlodasoli,quindi,iovielencoicomponentinecessari,leloropropriet,e vifacciovederecomedevevenire,voicostruireteiltuttoinmodoautonomo.Ok,iniziamo..... Perlaricercadovreteutilizzareuncomponente Inserimentotesto lacuipropriet nome dovr essere Tx_Nome . Pervisualizzareedinserireilnumerotelefonico,dovreteutilizzareuncomponente Inserimento testol acuiproprietnomedovressere Tx_Telefono . Utilizzeremo inoltre 3 componenti label (etichette di testo) e un separatore orizzontale per migliorarel'a spetto. Questisottosonoicomponenticheutilizzeremo:

Inserimentotesto

Label Separatore Orizzontale

Ilrisultatochedobbiamoottenerevisibilenell' immaginesuccessiva:

AppuntidiPython Allafine,doveteavereunafinestraidenticaaquellasotto..... beh,duevariazionirispettoallafinestrasottoveleconcedo,alpostodelnomeGianniscriveteil

vostronomeeiltitolodellafinestra,sevolete,variatelo.Chedire,buonlavoro.

Adessochelanostrafinestrafinita,noncirestachesalvareilnostroprogetto.Persalvarlo,andate sulmen project escegliere Salva .Viapparelafinestrasotto:

Selezionateviunacartellaincuiinserireilprogetto,dateunnomealprogettoealfilecheverr salvato.Tuttoilrestononimportantepernoi. Nel caso sopra, il progetto viene salvato nella cartella /usr/progetti/test/ con il nome di a genda.glade .Nonvifateingannaredall' estensione,a genda.glade unfilexml. Nellalezioneseguente,vedremocomefarfunzionarel' applicazioneconpython.

AppuntidiPython
Agganciare python all'interfaccia creata da Glade

E' arrivatoilmomentodicreareilprogrammaperfarfunzionarelanostrafinestraconpython. Provateascrivereiltestosottoesalvatelocomeagendagtk.py: #importgtk importgtk.glade #CaricaFinestra ApplicazioneGlade=gtk.glade.XML("agenda.glade") gtk.main() Adessoandatesulterminaleescrivetepythonagendagtk.py Vedreteapparirelaguidisegnataintuttoilsuosplendorema....seprovateapremereipulsantinon succedenulla,seprovateachiuderelafinestra,sichiudemailterminalerimanec ongelato .Usate ctrl+cperbloccarel' esecuzionedelcodice. E' ovviochemancaancoraqualcosa.Quandonoieseguiamoilcodicesopra,difattocreiamodegli oggetti.Tuttiicontrolli(pulsanti,finestre,caselleditestoecc...)inseritinellanostraapplicazione sonooggetti.Ognioggettohadelleproprietedeimetodi.Persemplificarelecosepossiamodire che le propriet sono tutte quelle caratteristiche che contraddistinguono il singolo oggetto. Un esempiodatodalnome:tuttiglioggettihannounnome.Seconsideriamouncampodiimmissione testoha,tralepropriet,ilvalore(dato)contenutoinesso,posizione,grandezzaecc... Quindiabbiamocapitocosasonolepropriet,cisipotevaarrivareanchedalnomestesso.Mai metodicosasono? Inmodomoltosemplicisticoerapportatounicamenteaglioggettidell'int erfacciagrafica,potremmo chiamareimetodiconunnomemoltopicomprensibile:eventi.Giilnome evento evocaun qualchecosachesiverificainundeterminatoattimooadunadeterminataazione,infatticos.Per fareunesempio,noivogliamocheallapressionedeltasto Ricerca (evento),ilprogrammaesegua la funzione relativa alla ricerca e visualizzazione del nome. Quindi gli eventi sono le azioni (funzioni)chevengonoeseguitealverificarsidiunazione(evento).Inglade,glieventivengono chiamatisegnali.Ora,avretecapitoquellochemancaallanostraapplicazione:illegametral' evento el' azione(funzione),quindiquandonoipremiamosulpulsantericerca(evento),nonc' definita nessuna azione(funzione).Allostessomodo,quandochiudiamolafinestra(evento),nonviene interrottal'a pplicazione. Rileggetequestidueparagrafi,cercatedicapireilconcetto,poirichiamategladeedilprogetto agendaevediamoinpratica.

AppuntidiPython
Propriet e segnali (eventi)

Serichiamiamoilnostroprogettoconglade,richiamandolanostrafinestraepremendosull'ogge tto diimmissionetestorelativoalnome,vedreteunafinestrasimileaquellasotto(senonlavedete poteterichiamarladalmenuvis ualizza/mostraeditordellepropriet: Quellesonoleproprietdell' oggettodiimmissionetesto. Il nome la propriet che identifica il singolo oggetto, cambiamoquestaproprietescriviamo nome Class ci indica il tipo di oggetto (da non cambiare assolutamente) Modificabile,Testovisibileecc..sicommentanodasoli Testoiltestodidefaultdavisualizzare,provateavariarloe guardatechecosasuccede.Limitateviasmanettaresolosulle prime3linguette(widget,packingecommon).Dopocheavete fattounpo' diesperimentirimettetetuttocomeprima,variando sololaproprietNome(alpostodientry1scrivetenome). Fattoquestorichiamate(facendociunclicksopral'oggtto)le e proprietdell'oggttodiimmissionecampo(daadessoinavanti e chiamati gtkentry) relativo al numero di telefono. In questo caso vedrete che la propriet class la stessa, poich sono oggettiuguali,conproprietdiversemaappartenentialsolito tipo.PerquestooggettocambiatelaproprietNomedaentry2atelefono. Dettoinparolemoltosemplici,potremmodirecheleproprietsonolecaratteristichedell'oggtto. e Percapiremeglioilconcetto,farounesempiorapportabileallarealtdituttiigiorni: immaginate di voler costruire un automobile. Per prima cosa progettate l' e costruite lo auto stampo , ovverotutte quellacatenadi montaggionecessariaalla suacostruzione.E' ovvio che quella catena di montaggio in grado di costruire quel particolare tipo di auto. La catena di montaggiosipuparagonareallaclasse.Laclasseunaspeciedis tampo, dacuivienegenerato l'oggtto.Seguardatelafigurasopra,noteretechec' e unaproprietchiamataclass(sottolavoce nome),quellociindicadacheclassederival'oggttoequindiiltipodioggetto.Tornandoalla e nostracatenadimontaggio,conessacostruiremoauto,verocheogniautosarugualeall' 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 possiamoimpostareanostropiacimento(nelcasodiunoggettiGtkEntrynome,lunghezza,testo ecc...). Facciamo un altro passo indietro e guardiamo la nostra automobile; quando l' abbiamo costruita,abbiamodecisoche:premendosulpedalel' autoparte,spingendounpulsantesiazionanoi tergicristalli, premendo un altro pedale l' si arresta e cos via. Tutte queste azioni sono auto conseguenti ad un evento. Nel nostro oggetto, gli eventi si chiamano metodi, ma per maggior comprensione,continueremoachiamarlieventi.Uneventopuesserelapressionediunpulsante,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 secondoallanostraapplicazione,quandosichiudevalafinestral' applicazionenonsichiudeva(la finestrasichiudevamailprogrammapythonrimaneva congelato) .Forseadessosareteriuscitia capirneilmotivo:nonc' eraunlegametral' evento(chiusuradellafinestra)el' azione(chiusura dell' applicazione).Primadiprocedere,viinvitoarileggerebenequest'ultimopragrafo. a

AppuntidiPython

Creare gli eventi

PartiamosubitocoldirecheinGlade,glieventisitrovanosottolalinguetta segnali. Perprima cosaleghiamol' eventodichiusuradellafinestra,conl' azionedichiusuradell' applicazione.Perfar ci,selezioniamolafinestra.Procedeteinquestomodo: DallafinestraprincipalediGlade,fatedoppioclicksulnomedellafinestra(nelriquadrobianco), oppure nella finestra dell' applicazione, premere col tasto destro del mouse, successivamente scorrere la lista del menu contestuale fino alla voce del nome della finestra (nel nostro caso dovrebbeesserewindow1)poipremeresullavoces eleziona . Adessoandatenellafinestrap roprietes elezionatelalinguetta segnali.E' daquestafinestrache selezioneremol' eventocheciinteressa. Adesso premete sul pulsante (...), di fianco alla voce segnale. Si apre una finestra dalla quale sceglierete delete_event poi premete sul pulsante aggiungi. L'e vento sar aggiunto all' elenco degli eventi per quell' oggetto (vedi figura a fianco). Segnatevi in un foglio ci che sta scritto sotto gestore (nel caso specifico:on_window1_delete_event):quelloilnome delsegnalerelativoaquell' oggetto. Orasalvateilprogettodall' appositomenu project di Glade. Eseguitoilsalvataggio,richiamate,conilvostroeditor preferito,ilprogramma agenda.py .Dobbiamoancora finire di collegare l' evento all' azione di chiusura del programma. Collegare un evento ad un azione relativamente semplice. Esso si svolge con due istruzioni: dic e signal_autoconnect(dic). Passiamo subito a vedere come diventer la nosta applicazione: importgtk.glade #CaricaFinestra ApplicazioneGlade=gtk.glade.XML("agenda.glade") #Collegaglieventi dic={ "on_window1_delete_event":gtk.mainquit } #Connessionedellecalllback ApplicazioneGlade.signal_autoconnect(dic) gtk.main() Notare l' istruzione ApplicazioneGlade.signal_autoconnect(dic): ApplicazioneGlade l' oggetto definitoalcunerighesopracon:ApplicazioneGlade=gtk.glade.XML("agenda.glade")

AppuntidiPython Adessoandatesulterminale,posizionatevisullacartelladelvostroprogettoescrivete: pythonagenda.py Apparirlafinestradell' agenda,maadesso,sechiudetelafinestra,verrchiusaanchel'a pplicazione edilterminalesarrilasciato.Questoperchallachiusuradellafinestra,vieneeseguitalafunzione gtk.mainquitcheterminailprogramma,comedefinitodall'ist ruzione: dic={ "on_window1_delete_event":gtk.mainquit } Rileggetelapartesoprafinquandononvichiaroal100%ilfunzionamento.Quellochevedremo inseguitolalogicaconseguenzadicicheavetelettofinoadora.
Ricerca/Inserisci/Elimina Il cerchio si stringe

Dopoquest' ultimocapitolo,saretesicuramenteingradodiscriverelevostreprimeapplicazioni python/gtk.Nelparagrafoprecedenteabbiamovistocomelegareuneventoadunazione.Inseguito vedremocomeunireuneventoadunafunzione.Periniziare,richiamiamolanostrafinestracon gladeevisualizziamolafinestradellepropriet. Oranecessarioselezionareilpulsantediinserimentoperimpostarel'evnto.Questaoperazione e necessitadiunpocodiattenzione.Ipulsantisonocompostidaben4oggettidistinti:l'im magine, l' etichetta, l' allineamento ed il pulsante vero e proprio. Per vedere i singoli oggetti, provate a premeresull'imm aginedelpulsante,noteretechesolol' immaginedelpulsanteselezionata,infatti sulleproprietpotetevederechesullavoceclassc' scrittoGTKimage.Adessoprovateafareun click sulla scritta inserisci del pulsante e guardate cosa c' scritto su class. Quello che noi vogliamo fare che, alla pressione del pulsante inserisci, il numero telefonico sia inserito nell' agenda.E' chiaroquindichenoidobbiamoselezionarel'i nteropulsanteedassegnarel' eventoa tuttoilpulsante.Perfarequestosidevesemplicementecliccareinunlatoestremodelpulsante,esso risulter selezionatointuttalasuainterezzaesulle propriet,allavoceclass, sarvisualizzato GTKButton. Adessocheaveteselezionatoilpulsante,passiamoallaselezionedell' azione.Premetesullalinguetta segnali della finestra propriet, successivamente, premete sul pulsante segnale (...), selezionate l' evento clicked epoisuaggiungi.Comenelcapitoloprecedente,ricordateviilnomedelgestore (dovrebbeessere,nelcasodelpulsanteinserisci:on_Bt_Inserisci_clicked,maquestoovviamente puvariareseavetechiamatoilpulsanteconun'a ltronome).Adessofatelastessacosaconglialtri duepulsanti(RicercaedElimina).Fattoci,salvateilprogettoerichiamateilcodiceagenda.py, conilvostroeditorpreferito. Attualmente,nelnostrocodice,abbiamounsoloeventoequindiquestocodice: #Collegaglieventi dic={ "on_window1_delete_event":gtk.mainquit } A questo codice, dobbiamo aggiungere anche gli altri 3 eventi dei pulsanti. Per far questo, sufficiente inserire la virgola di separazione, il nome dell' evento e la funzione che vogliamo associareall' evento.Quindipossiamoscrivere: #Collegaglieventi

AppuntidiPython dic={ "on_window1_delete_event":gtk.mainquit, "on_Bt_Inserisci_clicked":Inserisci, "on_Bt_Ricerca_clicked":Ricerca, "on_Bt_Elimina_clicked":Elimina } ScriveremooralefunzioniInserisci,RicercaedElimina. Iniziamo con la funzione di Inserimento. Essa non sar molto differente dalla funzione di inserimentocheavevamocreatoall'ini ziodiquestotutorial.Possiamoscriverlainquestomodo: defInserisci(obj): DizionarioNumeri[ApplicazioneGlade.get_widget(' entry1').gt_text()] e =ApplicazioneGlade.get_widget(' entry2') .get_text() Attenzionelarigadopoladefinizionedellafunzionecontinuaconlarigaimmediatamentesotto. Spieghiamounattimol' istruzioneapparentementecomplessa. DizionarioNumeriilnostrodizionariodefinitocon:DizionarioNumeri={} ApplicazioneGladelanostrafinestra,definitaconlariga: ApplicazioneGlade=gtk.glade.XML("agenda.glade") DoveApplicazioneGladediventaunoggettogeneratodalfile agenda.glade (ilfilesalvatocon glade) ApplicazioneGlade.get_widget(' entry1' ).get_text() L' istruzionesoprasignifica: prendiiltestocontenutonelcontrolloentry1dell'oggttoApplicationGlade,inpocheparoleprende e la finestra (ApplicazioneGlade), all'int della quale prende l' erno oggetto entry1 (get_widget ('e ntry1' )).Diquest'ult imooggetto,prendilaproprietget_text(cioilsuocontenuto). Sembracomplesso,masenecapiteilfunzionamento,virisulternaturalescrivereilcodice. Ora,qualcunosidovrebbeesserechiesto:m acomefaceviasaperecheentry1haunapropriet chiamataget_text?Semplice,misonolettoladocumentazione.Primadiprocedere,facciamoun secondodipausaeriflettiamosucomedev' esserelettaladocumentazione. Seandatesulsitodellepygtk,nellasezionedelladocumentazione,troviamounapaginaincuic' scritto:PyGTKClassHierarchy,cio,gerarchiadellaclassepygtk. http://www.pygtk.org/pygtk2reference/classhierarchy.html Essamostratutti icomponentieleloroderivazionedelleclassiGTK.Quindiabbiamotuttele proprietedimetodidelleGTK(leproprietedimetodideipulsanti,dellegriglie,deglientry ecc...).Ora,quellochenoiabbiamousatoperl'im missionedelnomeedelnumerotelefonicoun oggettogtkentry(guardatelonellaproprietclasssuglade).Bene,adessocercate,nellapaginadella documentazione, la parola gtk.entry (solo gtk.entry !!!). Premeteci sopra per vedere la documentazionerelativaaquell'oggtto. e Oradovresteavereunapaginachevielencalepropriet,traquestec' ancheget_text,seneandatea vedereildocumentorelativo,scoprireteche: The get_text()methodreturnsthevalueofthe

AppuntidiPython "text"propertywhichisastringcontainingthecontentsoftheentry, praticamentequestapropriet contieneilvaloreinseritonell'oggttoentry.Tuttoquestopusembrarecomplesso,maunavolta e capito,moltosemplicedaapplicare.Nonscordiamocichepythonunlinguaggioadoggettie quello che avete visto fin'o (propriet e metodi), stanno alla base di questo tipo di ra 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 provvedereteafare.Lecosecheandrannofattesono: 1.Implementareunsistemadisalvataggiodeidatiinunfile(comel' agendadalineadicomando del nostro primo esempio). Vi suggerisco di aggiungere un pulsante per il salvataggio, poi aggiungereuneventoecollegarloallafunzionedisalvataggio 2.Implementareunsistemadicaricamentodeidatidalfileinmemoria(vedisuggerimentosopra) 3.Adogniinserimentocancellareilcontenutodeidueentryusati Primadiiniziareasmanettare,cercatedicapireognisingolarigadelprogrammaedandateavedere leproprietdeglioggettiutilizzati,nellapaginadidocumentazionedipygtk.L'e sercizio,perdei principianti,nonfacilissimo.Nonscoraggiateviperchcapiretuttoquesto,significaavercapito comesipufareun' applicazioneconpythonelegtk. Diseguitoilcodicepythondellanostraagenda: importgtk.glade #CaricaFinestra ApplicazioneGlade=gtk.glade.XML("agenda.glade") DizionarioNumeri={} defRicerca(obj): ifDizionarioNumeri.has_key(ApplicazioneGlade.get_widget(' entry1' ).get_text()): ApplicazioneGlade.get_widget(' entry2' ).set_text (DizionarioNumeri [ApplicazioneGlade.get_widget(' entry1').gt_text()]) e defInserisci(obj): DizionarioNumeri[ApplicazioneGlade.get_widget(' entry1').gt_text()] e = ApplicazioneGlade.get_widget(' entry2' ).get_text() defElimina(obj): ifDizionarioNumeri.has_key(ApplicazioneGlade.get_widget(' entry1' ).get_text()): delDizionarioNumeri[ApplicazioneGlade.get_widget(' entry1').gt_text()] e ApplicazioneGlade.get_widget(' entry2' ).set_text('' ) ApplicazioneGlade.get_widget(' entry1' ).set_text('' ) #Collegaglieventi dic={ "on_window1_delete_event":gtk.mainquit, "on_Bt_Inserisci_clicked":Inserisci, "on_Bt_Ricerca_clicked":Ricerca, "on_Bt_Elimina_clicked":Elimina } #Connessionedellecalllback ApplicazioneGlade.signal_autoconnect(dic) gtk.main()

AppuntidiPython BuonDivertimento:)