Full Circle. Programmare in Python Volume 3 (Fullcircle Ubuntu Linux Magazine) (ITA)
Full Circle. Programmare in Python Volume 3 (Fullcircle Ubuntu Linux Magazine) (ITA)
SE
ED E P
RI
IZ RO
IO G
N RA
E
SP MM
LA RIVISTA INDIPENDENTE PER LA COMUNITÀ LINUX UBUNTU
EC A
EDIZIONE SPECIALE SERIE PROGRAMMAZIONE
IA ZIO
LE N
E
PROGRAMMARE
IN PYTHON
VOLUME 3
full circle magazine n. 31 1 indice ^
Full Circle Magazine non è affiliata né sostenuta da Canonical Ltd.
Full Circle
Cos'è Full Circle Come contattarci
Full Circle è una rivista gratuita e Sito web:
indipendente, dedicata alla famiglia http://www.fullcirclemagazine.org/
Ubuntu dei sistemi operativi Linux. Forum:
Ogni mese pubblica utili articoli LA RIVISTA INDIPENDENTE PER LA COMUNITÀ LINUX UBUNTU http://ubuntuforums.org/forumdispl
tecnici e articoli inviati dai lettori. ay.php?f=270
IRC:
Full Circle ha anche un podcast di Ecco a voi un altro Speciale monotematico! #fullcirclemagazine su
supporto, il Full Circle Podcast, con gli chat.freenode.net
stessi argomenti della rivista e altre Come richiesto dai nostri lettori, stiamo assemblando in edizioni dedicate
interessanti notizie. alcuni degli articoli pubblicati in serie. Gruppo editoriale
Capo redattore: Ronnie Tucker
Quella che avete davanti è la ristampa della serie Programmare in Python, (aka: RonnieTucker)
parti 17-21, pubblicata nei numeri 43-47: niente di speciale, giusto quello [email protected]
che abbiamo già pubblicato. Webmaster: Rob Kerfia
Si prega di notare che questa
(aka: admin / linuxgeekery-
edizione speciale viene fornita senza
Vi chiediamo, però, di badare alla data di pubblicazione: le versioni attuali di [email protected]
alcuna garanzia: né chi ha contribuito
hardware e software potrebbero essere diverse rispetto ad allora. Podcaster: Robin Catling
né la rivista Full Circle hanno alcuna
Controllate il vostro hardware e il vostro software prima di provare quanto (aka RobinCatling)
responsabilità circa perdite di dati o
descritto nelle guide di queste edizioni speciali. Potreste avere versioni più [email protected]
danni che possano derivare ai
recenti del software installato o disponibile nei repository delle vostre Manager delle comunicazioni:
computer o alle apparecchiature dei
distribuzioni. Robert Clipsham
lettori dall'applicazione di quanto
(aka: mrmonday) -
pubblicato.
Buon divertimento! [email protected]
Gli articoli contenuti in questa rivista sono stati rilasciati sotto la licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo
3.0. Ciò significa che potete adattare, copiare, distribuire e inviare gli articoli ma solo sotto le seguenti condizioni: dovete attribuire il lavoro all'autore
originale in una qualche forma (almeno un nome, un'email o un indirizzo Internet) e a questa rivista col suo nome ("Full Circle Magazine") e con suo
indirizzo Internet www.fullcirclemagazine.org (ma non attribuire il/gli articolo/i in alcun modo che lasci intendere che gli autori e la rivista abbiano esplicitamente autorizzato voi
o l'uso che fate dell'opera). Se alterate, trasformate o create un'opera su questo lavoro dovete distribuire il lavoro risultante con la stessa licenza o una simile o compatibile.
Full Circle magazine è completamente indipendente da Canonical, lo sponsor dei progetti di Ubuntu, e i punti di vista e le opinioni espresse nella rivista non
sono in alcun modo da attribuire o approvati da Canonical.
M
entre stavo realizzato il programma delle server. Lo facciamo attraverso (pensate al filo) al server. Se molti
concludendo l'ultimo ricette? Era un esempio MOLTO quello che chiamiamo pipe o client sono connessi al server, ogni
articolo della nostra semplice (e nemmeno tanto bello) socket. Se da piccoli avete creato client utilizzerà una lattina propria
serie, ho ricevuto una di applicazione client/server. Il un telefono con filo e lattine allora e il povero server deve avere lo
mail riguardante una gara di database SQLITE era il server, avete un'idea di cosa sto parlando. stesso numero di lattine tutte
programmazione. Anche se non l'applicazione che abbiamo scritto Altrimenti, lasciate che ve lo saldamente collegate a quelle
abbiamo tempo di occuparcene, era il client. Un esempio più descriva. Prima di tutto, dovevate corrispondenti dei client.
diversi siti propongono gare del calzante è il seguente. ottenere da vostra madre un paio di
genere durante l'anno. Le Consideriamo un database su un lattine di fagioli in scatola o Creiamo un client/server
informazioni sono reperibili computer ubicato diversi piani qualcosa di simile. Quindi, dopo semplice. Inizieremo dal server. In
all'indirizzo lontano dal vostro ufficio. Contiene averle pulite per bene le si portava pseudo codice, ecco cosa accade.
http://www.freiesmagazin.de/third informazioni sull'inventario del in garage. Si usava un chiodo sottile
_programming_contest, se siete negozio in cui lavorate. Usate un e un martello per creare un Crea un socket
interessati. Tutto questo mi ha registratore di cassa (uno di 10) forellino sul fondo di ciascuna. Recupera il nome del server
fatto pensare che non abbiamo mai all'interno del negozio. Ciascuno di Quindi bisognava procurarsi 405 Seleziona una porta
parlato di una vera questi registratori rappresenta un metri di filo (ancora dalla amata Associa il socket all'indirizzo e
programmazione Client/Server. client e il database posizionato da mamma), far passare l'estremità alla porta
Quindi, con questo obiettivo in qualche parte è il server. attraverso ciascuna lattina e Resta in attesa della connessione
mente ci addentriamo realizzare un nodo per evitare che Se connesso...
nell'argomento e vediamo dove ci Anche se non creeremo quel l'estremità fuoriuscisse. Quindi ci si Accetta la connessione
porta. genere di sistema, possiamo incontrava con il miglior amico e, Stampa che abbiamo la
impararne i concetti base. tenendo ben teso il filo, si parlava connessione
Cos'è un'applicazione nella lattina mentre il nostro amico Chiudi la connessione
Client/Server? Semplicemente, La prima cosa a cui bisogna teneva l'altra sull'orecchio. Le
ogniqualvolta usate un programma pensare è l'ubicazione del nostro vibrazioni del fondo si propagano Il vero codice per il nostro server
(o anche una interfaccia web) che server. Molte persone hanno solo lungo il filo teso provocando la si trova nella pagina seguente, in
accede ai dati di un'altra un computer nella propria casa. vibrazione del fondo dell'altra basso a sinistra.
applicazione o computer allora Altre ne possiedono 7 o 8. lattina. Ovviamente avreste potuto
state usando un sistema sentire anche senza, ma il punto Allora, abbiamo creato il socket,
client/server. Consideriamo un Per utilizzare il sistema non è questo. Era divertente. Il recuperato il nome della macchina
esempio che ci è familiare. client/server, bisogna connettersi socket è più o meno la stessa cosa. host su cui il server è in esecuzione,
Ricordate quando abbiamo dalla macchina client a quella Il client ha una connessione diretta associato il socket alla porta e
L
'ultima volta abbiamo la scacchiera con degli "0" e quindi Proseguiamo con la porzione
creato un sistema [0][0] | [0][1] | [0][2] inviare la "rappresentazione" della della routine che riguarda Move
[1][0] | [1][1] | [1][2] tavola al client. (mostrata in basso). Prima
client/server molto [2][0] | [2][1] | [2][2]
semplice. Questa volta lo controlliamo i primi quattro
espanderemo un po'. Il server sarà Il comando "Move" è un caratteri del comando passato per
Così, partendo dal codice del
una tavola e un validatore del gioco comando composto in quanto vedere se corrispondono a "Move".
server del mese passato, nella
del Tris (o cerchi e croci). La parte contiene il comando e la posizione In caso affermativo estraiamo la
funzione __init__ inseriamo le
client fungerà da input/output. nella quale il giocatore vuole parte restante della stringa a
seguenti righe:
muoversi. Per esempio, "Move A3". partire dalla posizione 5 (dato che
Inizieremo usando lo stesso # The next three lines are Analizzando il comando ricaveremo l'indice base è 0) e l'assegniamo alla
codice del server dell'ultima volta e new... tre informazioni, lo stesso comando variabile chiamata position. Quindi
lo modificheremo strada facendo. self.player = 1 "move", la riga e la colonna. Per controlliamo se il primo carattere è
self.gameboard = [['-','- finire, il comando "GOODB\E" una "A", "B", o "C". Rappresenta la
Se non lo avete ancora salvato, ','-'],['-','-','-'],['-','-
andate su ','-']] resetta, semplicemente, la tavola riga inviata dal client. Quindi
http://fullcirclemagazine.pastebin.c da gioco per un'altra partita. recuperiamo l'intero del carattere
om/UhquYN4N, recuperate il codice self.run() successivo e avremo la nostra
e proseguite. Il primo cambiamento Allora, riceviamo il comando dal colonna:
riguarda la routine __init__ dove Le routine run, listen, e servCmd client nella funzione procCmd.
inizializzeremo due nuove variabili, non sono cambiate, quindi ci Quindi lo analizziamo per vedere if cmd[:4] == 'Move':
self.player e self.gameboard. concentriamo sulle modifiche a cosa fare. All'interno della routine print "MOVE COMMAND"
procCmd. position = cmd[5:]
Gameboard è un semplice elenco di procCmd, portiamoci alla 5a riga e if position[0] == 'A':
liste o un array base. Possiamo rimuoviamo tutto il codice che row = 0
accedervi come segue Nell'articolo dell'ultima volta, il segue la riga contenente "if elif position[0] == 'B':
(maggiormente intuibile di una lista server attendeva un comando dal self.processingloop:". Ora row = 1
piatta). Questa lista conterrà i client e lo inviava alla funzione imposteremo i comandi così come li elif position[0] == 'C':
nostri dati. Ogni cella accetterà tre os.popen. Questa volta abbiamo definiti. Ecco il codice per row = 2
possibili valori. "0" indica una cella analizzeremo il comando ricevuto. il comando Start: else:
vuota, "[" una cella occupata dal In questo caso resteremo in attesa self.cli.send('Invalid
di tre comandi differenti. Sono if self.processingloop: position')
giocatore 1 e "O" una occupata dal return
"Start", "Move", e "GOODB\E". if cmd == 'Start':
giocatore 2. La griglia assomiglia self.InitGameBoard() col = int(position[1])-1
alla seguente quando la Quando riceviamo il comando self.PrintGameBoard(1)
rappresentiamo in due dimensioni: "Start", il server dovrà inizializzare
def PrintGameBoard(self,firsttime):
#Print the header row
outp = (' 1 2 3') + chr(13) + chr(10)
outp += (" A {0} | {1} | {2}".format(self.gameboard[0][0],self.gameboard[0][1],self.gameboard[0][2])) + chr(13)+chr(10)
outp += (' ------------')+ chr(13)+chr(10)
outp += (" B {0} | {1} | {2}".format(self.gameboard[1][0],self.gameboard[1][1],self.gameboard[1][2]))+ chr(13)+chr(10)
outp += (' ------------')+ chr(13)+chr(10)
outp += (" C {0} | {1} | {2}".format(self.gameboard[2][0],self.gameboard[2][1],self.gameboard[2][2]))+ chr(13)+chr(10)
outp += (' ------------')+ chr(13)+chr(10)
full circle magazine n. 44 8 lnglce ^
PROGRAMMARE IN PYTHON 0 PARTE 18
First, we will check each Row for a horizontal win: Il Client con ciascuno dei seguenti comandi
def checkwin(self,player): Ancora una volta, iniziamo (dovreste già avere il codice per le
#loop through rows and columns mosse A3 e B2), C1, A1, C3, B3, C2 e
dalla semplice routine creata
for c in range(0,3): quindi terminate con il comando
#check for horizontal line l'ultima volta. I cambiamenti
if self.gameboard[c][0] == player and iniziano subito dopo la chiamata a GOODB\E.
self.gameboard[c][1] == player and self.gameboard[c][2] == conn.makeConnection. Inviamo i
player:
print "*********\n\n%s wins\n\n*********" %
comandi Start, diversi Move e, per Xlteriori modifiche
player finire, Goodbye. La cosa più Ecco i "compiti per casa". Nel
playerwin = True importante da ricordare qui è che client, rimuovete i comandi
return playerwin dopo aver inviato un comando preparati per le mosse e usate
dovete attendere la risposta raw_input() per richiedere e
Next, we check each Column for a win:
#check for vertical line prima di inviarne un altro. catturare le mosse dal/dai
elif self.gameboard[0][c] == player and Immaginatela come una giocatore/i nella forma "A3" o "B2"
self.gameboard[1][c] == player and self.gameboard[2][c] == conversazione educata. Inviate la e quindi farli precedere da "Move"
player:
vostra richiesta, attendete la prima di inviare l'intero comando al
print "** %s wins **" % player
playerwin = True risposta, inviatene un'altra, server.
return playerwin attendete nuovamente, e così via.
In questo esempio usiamo Oa prossima volta
Now we check for the diagonal win from left to right...
raw_input semplicemente perchä modificheremo il nostro server
#check for diagonal win (left to right)
elif self.gameboard[0][0] == player and possiate vedere cosa avviene: per giocare come avversario.
self.gameboard[1][1] == player and self.gameboard[2][2] ==
player: if __name__ == '__main__': Il codice del Client e del Server
print "** %s wins **" % player conn =
playerwin = True CmdLine('localhost') puí essere trovato a questi
return playerwin conn.makeConnection() indirizzi:
conn.sendCmd('Start') http://fullcirclemagazine.pastebin.c
Then from right to left... conn.getResults() om/UhquYN4N o
#check for diagonal win (right to left) conn.sendCmd('Move A3')
elif self.gameboard[0][2] == player and conn.getResults() http://thedesignatedgeek.com.
self.gameboard[1][1] == player and self.gameboard[2][0] == r = raw_input("Press
player: Enter")
print "** %s wins **" % player conn.sendCmd('Move B2')
playerwin = True conn.getResults() Greg Walters è il proprietario della
return playerwin r = raw_input("Press RainyDay Solutions, LLC, una società
Enter") di consulenza in Aurora, Colorado e
Finally, if there is no win, we return false: programma dal 1972. Ama cucinare,
else: fare escursioni, ascoltare musica e
Continuate con la tripletta
playerwin = False passare il tempo con la sua famiglia.
return playerwin sendCmd, getResults, raw_input
Q
uesta volta lavoreremo per
SE “O” prende uno SPIGOLO ALLORA
terminare il nostro # Scenario 1
programma 'Tris'. Tuttavia, “X” dovrebbe prendere uno degli spigoli rimasti. Non importa quale.
diversamente dalla SE “O” blocca la vittoria ALLORA
“X” prende il restante spigolo.
maggior parte dei miei altri articoli,
Termina per vincere.
non fornirí il codice. Lo farete voi. ALTRIMENTI
Comunque vi darí le regole. Dopo 18 Termnare per vincere.
mesi, avete gli strumenti e le ALTRO SE “O” prende un LATO ALLORA
# Scenario 2
conoscenze per terminare questo
“X” prende il CENTRO
progetto. Ne sono sicuro. SE “O” blocca la vittoria ALLORA
“X” prende lo spigolo che non è delimitato con nessun “O”
Per prima cosa diamo uno sguardo Termina per vincere.
ALTRIMENTI
alla logica del gioco del Tris. Yedremo
Termina per vincere.
il suo pseudo0codice. Diamo prima ALTRIMENTI
un'occhiata al tavolo da gioco. È # “O” ha preso il centro – Scenario 3
disposto così... “X” prende lo spigolo diagonalmente opposto
alla mossa iniziale
SE “O” prende uno spigolo SE “X” non prende il centro ALLORA
Spigolo| Lato | Spigolo “O” prende il Centro
“X” prende il restante spigolo
-------+--------+------- SE “X” ha preso lo spigolo E il
Termina per vincere.
Lato | Centro | Spigolo lato ALLORA
ALTRIMENTI
-------+--------+------- #Scenario 5
# Il gioco avrà un pareggio – Scenario 4
Spigolo| Lato | Spigolo “O” prende lo spigolo
Blocca la vittoria di “O”.
Blocca ogni altra possibilità di vittoria diagonalmente opposto da quello di “X”
Ora, chiunque sia "[", inizia per Pareggio. Blocca ogni possibile
vittoria per pareggiare.
primo. La miglior mossa iniziale è ALTRIMENTI
prendere uno spigolo. Uno spigolo # “X” ha preso due Lati –
Alcune possibili giocate sono essere capaci di
qualunque, non importa quale sia. Ce Scenario 6
mostrate nella prossima pagina. modificare il codice del “O” prende lo spigolo
ne occuperemo con le combinazioni
Come si puí vedere, la logica è mese scorso per confinante con entrambe le “X”
di gioco per la prima mossa di "[", SE “X” blocca la vittoria
alquanto complessa, ma puí essere adattarlo, o come
che sono indicati destra. ALLORA
facilmente ripartita in una serie di minimo scriverne uno da
“O” prende ogni lato.
istruzioni IF (notare che ho utilizzato zero per essere un Bloccare e forzare il pareggio
Il punto di vista del giocatore "O"
"Then", ma in Python non lo usiamo, semplice programma ALTRIMENTI
è mostrato in basso a destra. Termina per vincere.
utilizziamo invece ":"). Dovreste desktop Tris.
full circle magazine n. 45 7 lnglce ^
PROGRAMMARE IN PYTHON 0 PARTE 19
Scenario 1
X | - | - X | - | - X | - | - X | - | - X | - | X X | - | X X | X | X Proposte e Autori
- | - |
- | - |
-
-
- | - | -
- | - | O
- | - | -
X | - | O
O | - | -
X | - | O
O | - | -
X | - | O
O | O | -
X | - | O
O | O | -
X | - | O
Cercansi
Scenario 2
X | - | - X | - | - X | - | - X | - | - X | - | X X | - | X X | X | X
- | - | - O | - | - O | X | - O | X | - O | X | - O | X | - O | X | -
- | - | - - | - | - - | - | - - | - | O - | - | O O | - | O X | - | O
Su LaunchPad abbiamo creato le
Scenario 3 pagine del progetto e della
X | - | - X | - | - X | - | - X | - | X X | O | X X | O | X X | O | X squadra Full Circle. L'idea è quella
- | - | - - | O | - - | O | - - | O | - - | O | - - | O | - - | O | X che i nonscrittori possono
- | - | - - | - | - - | - | X O | - | X O | - | X O | - | X O | - | X
collegarsi alla pagina, fare clic su
Scenario 4 "Answers" in alto e lasciare idee
X | - | - X | - | - X | - | - X | - | - X | - | - X | - | X X | O | X per articoli, ma vi prego siate
- | - | - - | O | - - | O | O X | O | O X | O | O X | O | O X | O | O specifici! Non inserite solo
- | - | - - | - | - - | - | X - | - | X O | - | X O | - | X O | - | X
"articolo sui server" ma indicate
Scenario 5 anche cosa il server dovrebbe fare!
X | - | - X | - | - X | - | - X | - | - X | - | - X | - | - X | - | X
- | - | - - | O | - - | O | X - | O | X X | O | X X | O | X X | O | X I lettori che volessero scrivere un
- | - | - - | - | - - | - | - - | - | O - | - | O O | - | O O | - | O
articolo ma sono a corto di idee,
Scenario 6 possono registrarsi alla pagina del
- | - | - - | - | - - | - | - - | - | - - | - | X O | - | X O | - | X gruppo Full Circle quindi auto0
X | - | - X | O | - X | O | - X | O | - X | O | - X | O | - X | O | - assegnarsi gli articoli proposti e
- | - | - - | - | - - | X | - O | X | - O | X | - O | X | - O | X | 0
iniziare a scrivere! Chiediamo che
se non è possibile scrivere
l'articolo nel giro di alcune
settimane (un
mese circa) la richiesta venga
riaperta per permettere a
qualcun'altro di adottarla.
Greg Walters è proprietario della
RainyDay Solution, LLC, una società 0 Pagina del progetto per le idee:
di consulenza in Aurora, Colorado, e https://launchpad.net/fullcircle
programma dal 1972. Gli piace 0 Pagina per il gruppo d'autori:
cucinare, fare escursioni, la musica e
https://launchpad.net/~fullcircle
trascorrere il tempo in famiglia.
B
entornati. Questa volta Yedrete comparire da qualche
# simple.py
torneremo a occuparci di parte sul desktop una semplice import pygtk
GUI ma utilizzando la finestra. Sul mio compare pygtk.require('2.0')
libreria pyGTN. Per il nell'angolo superiore sinistro. Per import gtk
momento non useremo un designer terminare il programma, dovete
class Simple:
di GUI, ma ricorreremo solo alla premere Ctrl+C nel terminale. def __init__(self):
libreria. Perchä? Non abbiamo aggiunto il self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
codice per distruggere e quindi self.window.show()
terminare l'applicazione. Questo lo def main(self):
Utilizzate Synaptic per installare
gtk.main()
python0gtk2, python0gtk20tutorial e andiamo a fare ora. Aggiungete la if __name__ == "__main__":
python0gtk20doc. seguente riga prima di simple = Simple()
self.window.show()... simple.main()
Iniziamo subito con il primo
programma che usa pyGTN, in alto a self.window.connect("delete_e l'evento delete a una routine di self.window.set_position(gtk.
vent", self.delete_event) WIN_POS_CENTER)
destra. servizio, in questo caso
self.delete_event. Ritornando
Quindi, dopo la chiamata Come potete ben immaginare,
Per un po' ci concentremo su del "False" si consente la rimozione
gtk.main(), aggiungete la seguente l'istruzione posiziona la finestra al
codice semplice. La riga 3 contiene della finestra dalla memoria di
funzione... centro dello schermo. Salvate
un nuovo comando. sistema.
"pygtk.require('2.0')" significa che il l'applicazione come "simple3.py"
def delete_event(self, ed eseguitela.
programma verrà eseguito solo se il widget, event, data=None): Ora non so voi ma io preferisco
modulo pygtk installato è, come gtk.main_quit() che le applicazioni si aprano al
minimo, alla versione 2.0. Nella return False centro dello schermo, non in una Ora è molto meglio, ma non è
routine __init__ assegniamo una posizione a caso, o in un angolo granchä. Allora aggiungiamo un
finestra alla variabile self.window Salvate la vostra applicazione dove potrebbe essere nascosta da widget. Se ricordate i YECCHI
(riga 8) e quindi la mostriamo (riga come "simple2.py" e, ancora una qualcos'altro. Modifichiamo il articoli su Boa Constructor, i widget
9). Ricordate che la funzione volta, eseguitela dal terminale. Ora, codice di conseguenza. Tutto quello non sono altro che controlli
__init__ è eseguita non appena la quando cliccate su "[" nella barra che dobbiamo fare è aggiungere la predefiniti che possiamo
classe è istanziata (riga 13). Salvate del titolo, l'applicazione terminerà. riga seguente prima di aggiungere alla nostra finestra per
il codice come "simple1.py". Cosa è accaduto, quindi? La prima self.window.connect nella funzione fare delle cose. Uno dei controlli
riga che abbiamo aggiunto __init__: più semplici da aggiungere è un
Eseguitelo in un terminale. (self.window.connect...) connette pulsante. Aggiungeremo il codice
S
e mi state seguendo da
tempo, dovreste ricordare le
lezioni 5 e 6. Allora parlammo
di Boa Constructor e del suo
utilizzo per realizzare applicazioni
dotate di interfaccia grafica. Bene,
questa volta impareremo a usare
Glade. Differente, ma simile. Lo potete
installare con Ubuntu Software Center:
cercate glade ed installate Costruttore
di interfacce utente GTN+ 2.