Appunti Di Python

download Appunti Di Python

of 46

Transcript of Appunti Di Python

AppuntidiPython

AppuntidiPythonScrittodaGiustiGianni [email protected]

AppuntidiPython

ChecosacontienequestodocumentoQuestodocumentocontienelamiaesperienzapersonaleconpython.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.

QualcheringraziamentoPrimadiiniziarevorreifarealcuniringraziamenti(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

PerchhodecisodiscrivereiltestoQuandosiiniziaadimparareunnuovostrumentodisviluppo,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.

GlistrumentidipythonsceltiperlosviluppoDovendoscriveregui(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.

DadoveiniziamoPerprimacosa,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.

LeVariabiliPerchinonsacosasonolevariabili,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=' [email protected]' print' Iomichiamo' ,Nome,Cognome print'LmiaEmail:',E ail a m Questoproduce: IomichiamoGianniGiusti LamiaEmail:[email protected] 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

InputdatastieraFinoadoratuttook,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,dizionarietupleListe 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' [email protected]'} 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': [email protected]'} ) agenda.append({'nom 'Cmick',' e': o cognome':'',' 'in email': [email protected]'} ) agenda.append({'nom 'Rssi' e': o ,'cognom e':'Bian email'[email protected]'} chi',' :' )

AppuntidiPython Nell' esempioabbiamolalistaagenda,compostada3dizionari. printagenda[0] restitituisceildizionario{' nome':'Gi anni','c ognome' :'Giusti' ail': [email protected]'} ,'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

IstruzionidibaseIstruzioneifewhile 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' areacreounloop,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 ifab 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.

AppuntidiPythonAgganciare 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.

AppuntidiPythonPropriet 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:)