fcm speciale: python, volume 1
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"