fcm speciale: python, volume 1

Upload: aldo

Post on 08-Apr-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/7/2019 FCM Speciale: Python, volume 1

    1/42

    full circle magazine n. 311 ""

    i n d i c e ^

    full circle

    PROGRAMMAREIN PYTHON

    VOLUME 1

    L A R I V I S T A I N D I P E N D E N T E P E R L A C O M U N I T L I N U X U B U N T U

    E D I Z I O N E S P E C I A L E S E R I E P R O G R A M M A Z I O N E

    F u l l C i r c l e M a g a z i n e n o n a f f i l i a t a n s o s t e n u t a d a C a n o n i c a l L t d .

    E

    E

    D

    D

    I

    I

    Z

    Z

    I

    I

    O

    O

    N

    N

    E

    E

    S

    S

    P

    P

    E

    E

    C

    C

    I

    I

    A

    A

    L

    L

    E

    E

    S

    S

    E

    E

    R

    R

    I

    I

    E

    E

    P

    P

    R

    R

    O

    O

    G

    G

    R

    R

    A

    A

    M

    M

    M

    M

    A

    A

    Z

    Z

    I

    I

    O

    O

    N

    N

    E

    E

  • 8/7/2019 FCM Speciale: Python, volume 1

    2/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    3/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    4/42full circle magazine n. 27 8 Indice ^

    PROGRAMMARE IN PYTHON - PARTE 1

    conserver nella scatola chiamata"nome" in modo da utilizzarlasucessivamente nel programma.

    print "Benvenuto " + nome + "!"

    Usiamo ancora il comandoprint per mostrare qualcosa sulloschermo: in questo caso"Benvenuto " pi qualsiasi cosasia contenuto nella variabile"nome" seguito da un punto

    esclamativo. Abbiamoconcatenato, o meglio, messoinsieme tre pezzi di informazione:"Benvenuto ", l'informazionecontenuta nella variabile "nome"e il punto esclamativo.

    Prima di procedere con ilprossimo esempio,approfondiamo alcuni argomenti.Apriamo un terminale e scriviamo:

    python

    Dovreste vedere qualcosa disimile al seguente:

    greg@earth:~/esempi_python$python

    Python 2.5.2 (r252:60911, Oct5 2008, 19:24:49)

    [GCC 4.3.2] on linux2

    Type "help", "copyright",

    "credits" or "license" for more information.

    >>>

    Vi trovate, a questo puntonella shell di python. A partire daqui potete eseguire un enormenumero di cose ma vediamo,prima di tutto, con cosa abbiamoa che fare. La prima cosa chepotrete notare la versione di

    python: la mia 2.5.2.Sucessivamente, potrete notareuna frase che dice che, perottenere aiuto, potete scrivere"help" sul terminale. Lascer chelo facciate autonomamente.Adesso scrivete:

    print 2+2

    e premete invio. Vi verr risposto

    >>> print 2+24>>>

    Notate che abbiamo scritto laparola "print" in minuscolo. Cosasarebbe successo se avessimoscritto "Print 2+2"? la rispostadell'interprete sarebbe stataquesta:

    >>> Print 2+2File "", line 1Print 2+2

    ^

    SyntaxError: invalid syntax>>>

    Questo dovuto al fatto che laparola "print" riconosciuto come

    comando mentre "Print" non lo .La differenza tra maiuscolo eminuscolo molto importante inPython.

    Adesso giochiamo un altro po'con le variabili.

    var = 2+2

    Noterete che non succedenulla a parte il fatto che Python viriproporr il solito prompt ">>>".Va tutto bene. Ci che abbiamo

    detto a Python di fare di creareuna variabile (scatola) chiamatavar e di metterci dentro la somma"2+2". Per vedere il contenutodella variabile var, scrivete:

    print var

    e premete invio

    >>> print var4>>>

    D'ora in poi potremo usare pi

    e pi volte var esattamente comese fosse il numero 4, come nelcaso seguente:

    >>> print var * 28>>>

    Se scriviamo nuovamente"print var" ecco cosa otterremo:

    >>> print var4>>>

    var non cambiata. ancora

    la somma di 2+2 ovvero 4.

    Stiamo facendo delle cosemolto semplici appositamente perun tutorial dedicato a chi alleprime armi. La complessit andrcrescendo nei prossimi tutorial.Ma per il momento vediamoqualche altro esempio sullevariabili.

    Scrivete, nell'inteprete, quantosegue:

    >>> strng = ' venuto il tempoper tutti i buoni uomini divenire in aiuto del partito!'>>> print strng venuto il tempo per tutti ibuoni uomini di venire inaiuto del partito!>>>

    Abbiamo creato una variabiledi nome strng (diminutivo di

  • 8/7/2019 FCM Speciale: Python, volume 1

    5/42

    OG O

  • 8/7/2019 FCM Speciale: Python, volume 1

    6/42full circle magazine n. 27 10 Indice ^

    ed eseguiamo il programma

    ./ciclo_for.py

    in un terminale.

    greg@earth:~/esempi_python$./ciclo_for.py0123456789greg@earth:~/esempi_python$

    Bene! Sembra che tutto abbiafunzionato anche se il conteggio proseguito solo fino a 9 prima difermarsi. Guardate nuovamentel'output. Ci sono 10 numeristampati, partendo dallo 0 earrivando al 9. Quest ci cheabbiamo chiesto: stampa 10 volte

    il valore di cntr aggiungendo ognivolta uno alla variabile e poitermina non appena questovalore 10.

    Potete notare che, per quantoprogrammare pu essere semplice,

    alle volte pu divenire complesso edovete essere sempre certi di quelche state chiedendo di fare al

    sistema. Se aveste modificato lachiamata in "range(1,10)" il cicloavrebbe iniziato a contare da 1 ma sisarebbe comunque fermato a 9poich, non appena cntr avesse

    contenuto 10, il ciclo sarebbeterminato. Perci, per fare in modoche venga stampato"1,2,3,4,5,6,7,8,9,10" dovremousare "range(1,11)" perch il ciclofor si interromper non appena ilnumero maggiore viene raggiunto.

    Notateanche lasintassi delcomando. "forvariabile inrange(valore iniziale, valore finale):". Ilsimbolo ":" avvisache quelche seguesarunbloccodicodiceche dovressere indentato. estremamenteimportanteche viricordiatediutilizzareidue punti ":" e che indentiateilcodicecontenuto nelblocco.

    Se modifichiamo il codice nelseguente modo:

    #! /usr/bin/env python

    for cntr in range(1,11):print cntr

    print 'Tutto fatto'

    avremo il seguente output...greg@earth:~/esempi_python$

    ./ciclo_for.py12

    345678

    910Tutto fattogreg@earth:~/esempi_python$

    Assicuratevi che l'indentazionesiacorretta.Ricordate: l'indentazionemostra la formattazione del blocco.Approfondiremo ulteriormentel'indentazione nei prossimi tutorial.

    Questo tutto per ora. Laprossima volta faremo un ripassoprima di andare avanti con altreistruzioni per la programmazionepython. Nel frattempoconsiderate l'installazione di unqualche editor specifico perpython come Dr. Python o SPE(Stani's Python Editor) entrambidisponibili tramite Synaptic.

    il proprietariodellauna societ di consulenza inAurora, Colorado e programmadal 1972. Ama cucinare, fare

    escursioni, ascoltare musica epassare il tempo con la suafamiglia.

    PROGRAMMARE IN PYTHON - PARTE 1

  • 8/7/2019 FCM Speciale: Python, volume 1

    7/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    8/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    9/42

    PROGRAMMARE IN PYTHON PARTE 2

  • 8/7/2019 FCM Speciale: Python, volume 1

    10/42

    full circle magazine #28 10 indice ^

    potremmo dire:

    se x == y allorafai qualcosa

    altrimentifai qualcos'altro

    In Python invece diremo:

    if x == y:fai qualcosa

    else:fai qualcos'altro

    Le cose principali da ricordarsisono:

    1. terminate ogni dichiarazioneif o else con il due punti

    2. INDENTATE le righe delvostro codice

    Se per caso aveste pi di unvalore da raffrontare, potresteusare il formato if/elif/else. Adesempio

    x = 5if x == 1:

    print 'X vale 1'elif x < 6:

    print 'X minore di 6'elif x < 10:

    print 'X minore di 10'else:

    print 'X maggiore o ugualea 10'

    Notate che stiamoutilizzando l'operatore '', minore ouguale a '=' e diverso da '!='.

    A questo punto, analizziamo ladichiarazione while. Ladichiarazione while permette dicreare dei cicli che saranno ripetutifino a che una determinata soglianon verr raggiunta (N.d.t. while

    == fintanto che). Un sempliceesempio sarebbe quello diassegnare ad una variabilechiamata "ciclo" il valore 1. Quindi,fintanto che la variabile sia minoreo uguale a 10, stampare il valoredi 'ciclo' e aggiungere 1 a ciclo.

    Quando ciclo superiore a 10,interrompere l'esecuzione.

    ciclo = 1 while ciclo

  • 8/7/2019 FCM Speciale: Python, volume 1

    11/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    12/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    13/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    14/42

    PROGRAMMARE IN PYTHON - PARTE 3

  • 8/7/2019 FCM Speciale: Python, volume 1

    15/42

    full circle magazine n. 29 10 indice ^

    % val2'. Possiamo usare ancheuna serie di funzioni incluse nelmodulo string di Pythonchiamate ljust e rjust. ljustgiustificher la stringa a

    sinistra, riempiendo la partedestra con qualsiasi carattere sivoglia. rjust fa la stessa cosa,eccetto che il riempimento va asinistra. Ora la parteinteressante. Usando lesostituzioni metteremo insieme

    una stringa bella corposa e laritorneremo al codicechiamante. Ecco la nostraprossima riga.

    return 'ss' % ('|',val1.ljust(col_sn-

    2,''),part2.rjust(col_dx-2,''),' |')

    Non lasciatevi scoraggiaredall'aspetto, dissezioniamolaper vedere quanto in realt siasemplice:

    - Restituiremo la

    nostra stringa al codicechiamante.'ss' - Andremo a racchiuderequattro valori nella stringa.Ciascun %s un segna posto.

    - Inizia la lista variabile- Stampa questi caratteri

    -Prende la variabile val1 cheabbiamo passato, la

    giustifichiamo a sinistra conspazi per (col_sn-2) caratteri.Sottraiamo per permettere '| 'sul lato sinistro.

    -

    Giustifichiamo a destra lastringa al prezzo di rightbit-2spazi. ' |' termina la stringa.

    Questo quanto. Anche sepotevo inserire un sistema per ilcontrollo degli errori, lascio

    questo compito a voi. Quindi...la nostra funzione Fmt di soledue righe senza la definizione e

    i commenti. Lapossiamochiamare inquesto modo.

    printFmt('Oggetto1',30,oggetto1,10)

    Di nuovo, avremmo potutoassegnare il valore di ritorno adun'altra stringa, masemplicemente la stampiamo.Notate che abbiamo inviato 30per la larghezza della parte

    sinistra e 10 per quella destra.Questi uguagliano il 40 inviatoprecedentemente alla routineSopraOrSotto. Allora, avvia iltuo editor e inserisci il codice

    sottostante.

    Salvate il codice come

    #pprint1.py#Esempio di funzioni quasi-utili

    def SopraOrSotto(carattere,larghezza):# 'larghezza' la larghezza totale della riga ritornatareturn '%s%s%s' % ('+',(carattere * (larghezza-2)),'+')

    def Fmt(val1,col_sn,val2,col_dx):# stampa due valori riempiti con spazi# val1 stampato a sinistra, val2 stampato a destra# col_sn la larghezza della parte sinistra, col_sn la larghezza della parte destrapart2 = '%.2f' % val2

    return '%s%s%s%s' % ('| ',val1.ljust(col_sn-2,' '),part2.rjust(col_dx-2,' '),' |')# Definiamo il prezzo di ciascun oggettooggetto1 = 3.00oggetto2 = 15.00# Ora stampiamo il tutto...print SopraOrSotto('=',40)print Fmt('Oggetto 1',30,oggetto1,10)print Fmt('Oggetto 2',30,oggetto2,10)print SopraOrSotto('-',40)print Fmt('Totale',30,oggetto1+oggetto2,10)print SopraOrSotto('=',40)

    +======================================+| Oggetto 1 3.00 || Oggetto 2 15.00 |+--------------------------------------+| Totale 18.00 |

    +======================================+

    PROGRAMMARE IN PYTHON - PARTE 3

    ' i t1 ' d it l t ti i t ti

  • 8/7/2019 FCM Speciale: Python, volume 1

    16/42

    full circle magazine n. 29 11 indice

    'pprint1.py' ed eseguitelo.L'output dovrebbe assomigliareal testo in alto a destra dellapagina precedente.

    Anche se questo unesempio molto semplice, vidovrebbe dare una buona idea su

    come usare le funzioni. Ora,estendiamo ancora un p ilconcetto e impariamo qualcosasulle liste. Ricordate quando nellaparte 2 abbiamo iniziato adiscuterne? Bene, una cosa cheho tralasciato che una lista pucontenere qualunque cosa,comprese altre liste. Dichiariamouna nuova lista nel nostro

    programma chiamata oggetti eriempiamola cos:

    oggetti =[['Soda',1.45],['Caramelle',.75],['Pane',1.95],['Latte',2.59]]

    Se volessimo accedervi comefosse una normale listauseremmo print oggetti[0]. Per,

    ci che otterremmo ['Soda',1.45], che non proprioquello che cercavamo. Noivogliamo accedere a ciascunoggetto della lista. Cos useremo'print oggetti[0][0]' per 'Soda' e[0][1] per recuperarne il costo di1.45. Ora, abbiamo 4 oggetti che

    sono stati acquistati evogliamo usare questainformazione nellanostra routine print.L'unica modifica daapportare riguarda laparte finale delprogramma. Salviamo

    l'ultimo programmacome 'pprint2.py',quindi commentate ladefinizione dei due oggettox einseriamo la lista di cui sopra.Ora dovrebbe assomigliare aquesto.

    #oggetto1 = 3.00#oggetto2 = 15.00

    oggetti=[['Soda',1.45],['Caramelle',.75],['Pane',1.95],['Latte',2.59]]

    Dopo, rimuovete tutte le righeche chiamano Fmt(). Quindiaggiungete le seguenti righe(con #NUOVA RIGA alla fine) perrendere il vostro codice comequello mostrato

    a destra.

    Hoimpostato unavariabilecontatore nelfor che ciclanella lista per

    ciascun suo elemento. Notateche ho anche impostato unavariabile chiamata totale.Abbiamo impostato totale a 0prima di entrare nel for. Quindiquando si stampa ciascunoggetto venduto, aggiungiamo il

    costo al totale. Infine, stampiamoil totale subito dopo la rigaseparatore. Salvate il programmaed eseguitelo. Dovreste ottenerequalcosa di simile al testo inbasso.

    Se siete un po' folli, poteteaggiungere una riga per le tasse.

    Fatelo imitando la riga totale, mausando (totale * .086) comecosto.

    printFmt('Tasse:',30,totale*.086,10)

    Se volete, potete aggiungerealtri oggetti alla lista e vederecome va. Questo tutto perquesta parte. La prossima voltaci concentreremo sulle classi.

    oggetti = [['Soda',1.45],['Caramelle',.75],['Pane',1.95],['Latte',2.59]]

    print SopraOrSotto('=',40)

    totale = 0 #NUOVA RIGAfor cntr in range(0,4): #NUOVA RIGA

    print Fmt(oggetti[cntr][0],30,oggetti[cntr][1],10) #NUOVA RIGAtotale += oggetti[cntr][1] #NUOVA RIGA

    print SopraOrSotto('-',40)

    print Fmt('Totale',30,totale,10) #RIGA CAMBIATAprint SopraOrSotto('=',40)

    +======================================+| Soda 1.45 || Caramella 0.75 || Pane 1.95 || Latte 2.59 |+--------------------------------------+| Totale 6.74 |+======================================+

    il proprietariodellauna societ di consulenza inAurora, Colorado e programmadal 1972. Gli piace cucinare, fareescursioni, ascoltare musica epassare il tempo con la suafamiglia.

    http://-/?-
  • 8/7/2019 FCM Speciale: Python, volume 1

    17/42

    /--BeagleDog ---|-- Lab

    \--Shepherd/Heeler

    Beagle = Dog()Beagle.Name = 'Archie'Beagle.Height = 'Short'Beagle.Build = 'Chubby'

    Beagle.Color = 'Brown'

    class Dog():

    def __init__(self,dogname,dogcolor,dogheight,dogbuild,dogmood,dogage):#here we setup the attributes of our dogself.name = dognameself.color = dogcolorself.height = dogheightself.build = dogbuildself.mood = dogmoodself.age = dogageself.Hungry = False

    self.Tired = False

    PROGRAMMARE IN PYTHON - PARTE 4

  • 8/7/2019 FCM Speciale: Python, volume 1

    18/42

    Beagle =

    Dog('Archie','Brown','Short','Chubby','Grumpy',12)print Beagle.nameprint Beagle.colorprint Beagle.moodprint Beagle.Hungry

    My name is Archie My color is Brown My mood is GrumpyI am hungry = FalseSniff Sniff...Not Hungry

    Yum Yum...Num NumGRRRRR...Woof Woof

    Lab =Dog('Nina','Black','Medium','Heavy','Laid Back',7)Heeler =Dog('Bear','Black','Tall','Skinny','Crazy',9)print 'My Name is %s' %

    Lab.nameprint 'My color is %s' %Lab.colorprint 'My Mood is %s' %

    Lab.moodprint 'I am hungry = %s' %Lab.HungryLab.Bark()Heeler.Bark()

    My name is Archie My color is Brown

    My mood is GrumpyI am hungry = FalseSniff Sniff...Not Hungry

    def Eat(self):if self.Hungry:

    print 'Yum Yum...Num Num'self.Hungry = False

    else:

    print 'Sniff Sniff...Not Hungry'def Sleep(self):

    print 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'self.Tired = False

    def Bark(self):if self.mood == 'Grumpy':

    print 'GRRRRR...Woof Woof'elif self.mood == 'Laid Back':print 'Yawn...ok...Woof'

    elif self.mood == 'Crazy':print 'Bark Bark Bark Bark Bark Bark Bark'

    else:print 'Woof Woof'

    PROGRAMMARE IN PYTHON - PARTE 4

  • 8/7/2019 FCM Speciale: Python, volume 1

    19/42

    Yum Yum...Num NumGRRRRR...Woof Woof My Name is Nina My color is Black My Mood is Laid BackI am hungry = False

    Yawn...ok...WoofBark Bark Bark Bark BarkBark Bark

    class Dog():def __init__(self,dogname,dogcolor,dogheight,dogbuild,dogmood,dogage):

    #here we setup the attributes of our dogself.name = dognameself.color = dogcolor

    self.height = dogheightself.build = dogbuildself.mood = dogmoodself.age = dogageself.Hungry = Falseself.Tired = False

    def Eat(self):if self.Hungry:

    print 'Yum Yum...Num Num'self.Hungry = False

    else:print 'Sniff Sniff...Not Hungry'

    def Sleep(self):print 'ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'self.Tired = False

    def Bark(self):if self.mood == 'Grumpy':

    print 'GRRRRR...Woof Woof'elif self.mood == 'Laid Back':

    print 'Yawn...ok...Woof'elif self.mood == 'Crazy':

    print 'Bark Bark Bark Bark Bark Bark Bark'else:

    print 'Woof Woof'

    Beagle = Dog('Archie','Brown','Short','Chubby','Grumpy',12)print 'My name is %s' % Beagle.nameprint 'My color is %s' % Beagle.colorprint 'My mood is %s' % Beagle.moodprint 'I am hungry = %s' % Beagle.HungryBeagle.Eat()Beagle.Hungry = TrueBeagle.Eat()Beagle.Bark()

  • 8/7/2019 FCM Speciale: Python, volume 1

    20/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    21/42

    del frame, tenete premuto il frame. Poi, ripassare al designer, All'inizio, c' il metodo

    PROGRAMMARE IN PYTHON - PARTE 5

  • 8/7/2019 FCM Speciale: Python, volume 1

    22/42

    full circle magazine n. 31 indice ^

    tasto Ctrl e usate i tasti frecciaper muoverlo dove si vuole. Oraosservate l'inspector. Ci sonoquattro linguette. Cliccare su'Constr'. Da qui possiamocambiare etichetta, nome,posizione, dimensione e stile.

    Per ora cambiamo il nome in'btnShowDialog' e la proprietLabel in 'Cliccami'.

    Ora, trascuriamo il resto dellalinguetta e passiamo a quellaObjs. Questa mostra tutti icontrolli usati e la loro relazionegenitore/figlio. Come potetevedere, il pulsante figlio dipanel1, che figlio di Frame1.

    Premete Invia e salvate icambiamenti. Ritornate ancorauna volta al designer, e notateche (assumendo che sia ancoraselezionata la linguetta Objs),Frame1 ora selezionato.Questo va bene perch quello

    che ci serve. Ritornare allalinguetta 'Constr', e cambiare iltitolo da 'Frame1' a 'La nostraprima GUI'. Cliccate Invia esalvate ancora una volta. Ora

    eseguiamo la nostraapplicazione. Cliccate il pulsantegiallo Esegui nell'Editor.

    Cliccate quanto volete sulpulsante, ma non accadr nulla.Perch? Bene, non abbiamodetto al pulsante cosa fare. Perquesto, dobbiamo impostare unevento che deve verificarsiquando l'utente clicca il nostrobottone. Cliccare sulla Xnell'angolo in alto a sinistra perinterrompere l'esecuzione del

    selezionate il pulsante e andatenella linguetta 'Evts'dell'Ispezionatore. Cliccate suButtonEvent e quindi doppioclick su wx.EVT_BUTTON, enotate che nella finestra sottootteniamo un pulsante evento

    chiamato'OnBtnShowDialogButton'. Clicsu Invia e salvate.

    Prima di andare oltre,guardiamo cosa abbiamoottenuto sotto forma di codice(pagina 11).

    La prima riga un commentoche dice a Boa Constructor chesi tratta di un file boa. ignoratodal compilatore Python, ma nonda Boa. La riga successivaimporta wxPython. Ora saltiamoalla definizione della classe.

    init_ctrls. Notate il commentoproprio sotto la definizione. Nonmodificate il codice di questasezione. Se lo fate, lorimpiangerete. Ovunque SOTTOquesta routine dovrebbe esseresicuro. In questa routine,

    troverete le definizioni di ciascuncontrollo del nostro frame.

    Quindi, osservate la routine__init__. Qui potete inserirequalunque chiamata al codice diinizializzazione. Infine, la routineOnBtnShowDialogButton. Qui dove metteremo il codice daeseguire quando l'utente clicca il

    pulsante. Osservate che ora quic' la riga event.Skip(). In parolesemplici, dice di uscire dallaroutine quando si richiamal'evento.

    Ora, quello che faremo chiamare un finestra messaggioda far comparire con del testo.Si tratta di un'operazione

    comune per i programmatori perportare a conoscenza l'utente diqualcosa - un errore, o che unprocesso terminato. In questocaso, chiameremo l'inclusaroutine wx.MessageBox. Laroutine viene chiamata con dueparametri. Il primo il testo che

    http://-/?-http://-/?-
  • 8/7/2019 FCM Speciale: Python, volume 1

    23/42

    wx.MessageBox('Hai cliccatoil pulsante', 'Info')

    wx.MessageBox('Hai cliccatoil pulsante, 'Info',

    wx.ICON_INFORMATION)

    #Boa:Frame:Frame1import wxdef create(parent):

    return Frame1(parent)[wxID_FRAME1, wxID_FRAME1BTNSHOWDIALOG, wxID_FRAME1PANEL1,] = [wx.NewId() for _init_ctrls in range(3)]

    class Frame1(wx.Frame):def _init_ctrls(self, prnt):

    # generated method, don't edit wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,

    pos=wx.Point(543, 330), size=wx.Size(458, 253),style=wx.DEFAULT_FRAME_STYLE, title=u'Our First GUI')

    self.SetClientSize(wx.Size(458, 253))self.panel1 = wx.Panel(id=wxID_FRAME1PANEL1, name='panel1', parent=self,

    pos=wx.Point(0, 0), size=wx.Size(458, 253),

    style=wx.TAB_TRAVERSAL)self.btnShowDialog = wx.Button(id=wxID_FRAME1BTNSHOWDIALOG,

    label=u'Click Me', name=u'btnShowDialog', parent=self.panel1,pos=wx.Point(185, 99), size=wx.Size(85, 32), style=0)

    self.btnShowDialog.Bind(wx.EVT_BUTTON, self.OnBtnShowDialogButton,id=wxID_FRAME1BTNSHOWDIALOG)

    def __init__(self, parent):self._init_ctrls(parent)

    def OnBtnShowDialogButton(self, event):event.Skip()

  • 8/7/2019 FCM Speciale: Python, volume 1

    24/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    25/42

    Codice FrameMain:

  • 8/7/2019 FCM Speciale: Python, volume 1

    26/42

    Codice GUI2:

    #!/usr/bin/env python#Boa:App:BoaApp

    import wx

    import FrameMainimport FrameSecond

    modules ={u'FrameMain': [1, 'Main frame of Application',u'FrameMain.py'],

    u'FrameSecond': [0, '', u'FrameSecond.py']}

    class BoaApp(wx.App):def OnInit(self):

    self.main = FrameMain.create(None)self.main.Show()self.SetTopWindow(self.main)return True

    def main():application = BoaApp(0)application.MainLoop()

    if __name__ == '__main__':main()

    #Boa:Frame:FrameMain

    import wximport FrameSecond

    def create(parent):return FrameMain(parent)

    [wxID_FRAMEMAIN, wxID_FRAMEMAINBTNEXIT,wxID_FRAMEMAINBTNSHOWNEW,

    wxID_FRAMEMAINPANEL1,] = [wx.NewId() for _init_ctrls in range(4)]

    class FrameMain(wx.Frame):

    def _init_ctrls(self, prnt):# generated method, don't editwx.Frame.__init__(self, id=wxID_FRAMEMAIN,

    name=u'FrameMain',parent=prnt, pos=wx.Point(846, 177),

    size=wx.Size(400, 340),style=wx.DEFAULT_FRAME_STYLE, title=u'Main

    Frame')self.SetClientSize(wx.Size(400, 340))

    self.Center(wx.BOTH)

    self.panel1 = wx.Panel(id=wxID_FRAMEMAINPANEL1,name='panel1',

    parent=self, pos=wx.Point(0, 0),size=wx.Size(400, 340),

    style=wx.TAB_TRAVERSAL)

    self.btnShowNew =wx.Button(id=wxID_FRAMEMAINBTNSHOWNEW,

    label=u'Show the other frame',name=u'btnShowNew',

    parent=self.panel1, pos=wx.Point(120,103), size=wx.Size(168, 29),

    style=0)self.btnShowNew.SetBackgroundColour(wx.Colour(25,

    175, 23))

    self.btnShowNew.Bind(wx.EVT_BUTTON,self.OnBtnShowNewButton,id=wxID_FRAMEMAINBTNSHOWNEW)

    C di F M i ( t ) i 849 4

  • 8/7/2019 FCM Speciale: Python, volume 1

    27/42

    Codice FrameMain (cont.):self.btnExit =

    wx.Button(id=wxID_FRAMEMAINBTNEXIT, label=u'Exit',name=u'btnExit', parent=self.panel1,

    pos=wx.Point(162, 191),size=wx.Size(85, 29), style=0)

    self.btnExit.SetBackgroundColour(wx.Colour(225,218, 91))

    self.btnExit.Bind(wx.EVT_BUTTON,self.OnBtnExitButton,

    id=wxID_FRAMEMAINBTNEXIT)

    def __init__(self, parent):self._init_ctrls(parent)

    self.Fs = FrameSecond.FrameSecond(self)def OnBtnShowNewButton(self, event):

    #event.Skip()self.Fs.Show()self.Hide()

    def OnBtnExitButton(self, event):#event.Skip()

    self.Close()

    Codice FrameSecond:#Boa:Frame:FrameSecond

    import wx

    def create(parent):return FrameSecond(parent)

    [wxID_FRAMESECOND, wxID_FRAMESECONDBTNFSEXIT,wxID_FRAMESECONDPANEL1,

    wxID_FRAMESECONDSTATICTEXT1,] = [wx.NewId() for _init_ctrls in range(4)]

    class FrameSecond(wx.Frame):def _init_ctrls(self, prnt):

    # generated method, don't editwx.Frame.__init__(self, id=wxID_FRAMESECOND,

    name=u'FrameSecond',

    parent=prnt, pos=wx.Point(849, 457),size=wx.Size(419, 236),

    style=wx.DEFAULT_FRAME_STYLE, title=u'SecondFrame')

    self.SetClientSize(wx.Size(419, 236))self.Center(wx.BOTH)

    self.SetBackgroundStyle(wx.BG_STYLE_COLOUR)

    self.panel1 = wx.Panel(id=wxID_FRAMESECONDPANEL1,name='panel1',

    parent=self, pos=wx.Point(0, 0),size=wx.Size(419, 236),

    style=wx.TAB_TRAVERSAL)

    self.btnFSExit = wx.Button(id=wxID_FRAMESECONDBTNFSEXIT, label=u'Exit',name=u'btnFSExit', parent=self.panel1,

    pos=wx.Point(174, 180),size=wx.Size(85, 29), style=0)

    self.btnFSExit.Bind(wx.EVT_BUTTON,self.OnBtnFSExitButton,

    id=wxID_FRAMESECONDBTNFSEXIT)

    self.staticText1 =wx.StaticText(id=wxID_FRAMESECONDSTATICTEXT1,label=u"Hi there...I'm the second form!",

    name='staticText1',parent=self.panel1, pos=wx.Point(45, 49),

    size=wx.Size(336, 23),style=0)

    self.staticText1.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD,

    False, u'Sans'))

    def __init__(self, parent):self._init_ctrls(parent)self.parent = parent

    def OnBtnFSExitButton(self, event):#event.Skip()self.parent.Show()self.Hide()

    Tipo controllo - Prefisso nome

  • 8/7/2019 FCM Speciale: Python, volume 1

    28/42

    Static text - st_Button - btn_Text Box - txt_Check Box - chk_Radio Button - rb_

    Frame - Frm_ or Frame_

  • 8/7/2019 FCM Speciale: Python, volume 1

    29/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    30/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    31/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    32/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    33/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    34/42

    #!/usr/bin/python#------------------------------------------------------# Ricettario.py# Creato per Programmare in Python #8# e Full Circle Magazine#------------------------------------------------------import apswimport stringimport webbrowser

    class Ricettario:

    def Menu():cbk = Ricettario() # Inizializza la classe

    Menu()

    def Menu():cbk = Ricettario() # Inizializza la classeloop = True

    while loop == True:print

    '==================================================='print ' DATABASE RICETTE'print

    '==================================================='print ' 1 - Mostra tutte le ricette'print ' 2 - Cerca una ricetta'print ' 3 - Mostra una ricetta'print ' 4 - Elimina una ricetta'print ' 5 - Aggiungi una ricetta'print ' 6 - Stampa una ricetta'print ' 0 - Esci'print

    '==================================================='response = raw_input('Inserisci una selezione -> ')

  • 8/7/2019 FCM Speciale: Python, volume 1

    35/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    36/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    37/42

  • 8/7/2019 FCM Speciale: Python, volume 1

    38/42

    def CercaRicetta(self):# mostra il menu di ricercaprint '-------------------------------'

    i t ' C i '

  • 8/7/2019 FCM Speciale: Python, volume 1

    39/42

    print ' Cerca in'print '-------------------------------'print ' 1 - Nome ricetta'print ' 2 - Provenienza ricetta'print ' 3 - Ingredienti'print ' 4 - Esci'cercain = raw_input('Inserire Tipo di Ricerca -> ')if cercain != '4':

    if cercain == '1':cerca = 'Nome Ricetta'

    elif cercain == '2':cerca = 'Provenienza Ricetta'

    elif cercain == '3':

    cerca = 'Ingredienti'parm = cercainrisposta = raw_input('Cosa cerco in %s (nulla per uscire) -> ' % cerca)if parm == '1': # Nome Ricetta

    sql = "SELECT pkid,nome,provenienza,porzioni FROM Ricette WHERE nome like '%%%s%%'" %rispostaelif parm == '2': # Provenienza Ricetta

    sql = "SELECT pkid,nome,provenienza,porzioni FROM Ricette WHERE provenienza like '%%%s%%'" %rispostaelif parm == '3': # Ingredienti

    sql = "SELECT r.pkid,r.nome,r.porzioni,r.provenienza,i.ingredienti FROM Ricette r Left Join ingredienti

    i on (r.pkid = i.ricettaid) WHERE i.ingredienti like '%%%s%%' GROUP BY r.pkid" %rispostatry:

    if parm == '3':print '%s %s %s %s %s'

    %('Item'.ljust(5),'Nome'.ljust(30),'Porzioni'.ljust(20),'Provenienza'.ljust(30),'Ingredienti'.ljust(30))print '--------------------------------------------------------------------------------------'

    else:print '%s %s %s %s' %('Item'.ljust(5),'Nome'.ljust(30),'Porzioni'.ljust(20),'Provenienza'.ljust(30))print '--------------------------------------------------------------------------------------'

    for x in cursore.execute(sql):if parm == '3':

    print '%s %s %s %s %s'%(str(x[0]).rjust(5),x[1].ljust(30),x[2].ljust(20),x[3].ljust(30),x[4].ljust(30))

    else:print '%s %s %s %s' %(str(x[0]).rjust(5),x[1].ljust(30),x[3].ljust(20),x[2].ljust(30))

    except:print 'Errore'

    print '--------------------------------------------------------------------------------------'inkey = raw_input('Premere un tasto')

  • 8/7/2019 FCM Speciale: Python, volume 1

    40/42

    cbk.InserisciNuova()

    Inserire una selezione -> 2-------------------------------Cerca in-------------------------------1 - Nome Ricetta2 - Provenienza Ricetta3 - Ingredienti4 - EsciInserire Tipo di Ricerca -> 1Cosa cerco in Nome Ricetta (nulla per uscire) -> riceItem Nome Porzioni Provenienza--------------------------------------------------------------------------------------

    1 Spanish Rice 4 Greg--------------------------------------------------------------------------------------Premere un tasto

    Inserire una selezione -> 2-------------------------------Cerca in

    -------------------------------1 - Nome Ricetta2 - Provenienza Ricetta3 - Ingredienti4 - EsciInserire Tipo Ricerca -> 3Cosa cerco in Ingredienti (nulla per uscire) -> onionItem Nome Porzioni Provenienza Ingredienti

    --------------------------------------------------------------------------------------1 Spanish Rice 4 Greg 1 smallOnion chopped2 Pickled Pepper-Onion Relish 9 half pints Complete Guide to Home Canning 6 cupsfinely chopped Onions--------------------------------------------------------------------------------------Premere un tasto

  • 8/7/2019 FCM Speciale: Python, volume 1

    41/42

    cbk.MostraTutteRicette()

  • 8/7/2019 FCM Speciale: Python, volume 1

    42/42

    ()print '0 - Torna al Menu'try:

    res = int(raw_input('Seleziona una Ricetta da ELIMINARE o 0 per uscire ->'))

    if res != 0:cbk.Stampa(res)

    elif res == '0':print 'Torno al Menu...'

    else:print 'Comando non riconosciuto. Torno al menu.'

    except ValueError:print 'Non un numero...torno al menu.'

    def Stampa(self,quale):fi = open('stamparicetta.html','w')sql = "SELECT * FROM Ricette WHERE pkID = %s" % quale

    for x in cursore.execute(sql):NomeRicetta = x[1]ProvenienzaRicetta = x[3]PorzioniRicetta = x[2]

    fi.write("%s" % NomeRicetta)fi.write("Provenienza: %s" % ProvenienzaRicetta)fi.write("Porzioni: %s" % PorzioniRicetta)fi.write(" Lista Ingredienti: ")sql = 'SELECT * FROM Ingredienti WHERE RicettaID = %s' % quale

    for x in cursore.execute(sql):fi.write("%s" % x[1])fi.write("Istruzioni:")sql = 'SELECT * FROM Istruzioni WHERE RicettaID = %s' % qualefor x in cursore.execute(sql):

    fi.write(x[1])fi.close()

    webbrowser.open('stamparicetta.html')print "Fatto"