dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuepy06_it.pdf · dl.fullcirclemagazine.org...

22

Upload: others

Post on 09-May-2020

17 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

Full CircleEDIZIONE SPECIALE SERIE PROGRAMMAZIONE

LA RIVISTA INDIPENDENTE PER LA COMUNITÀ LINUX UBUNTU

full circle magazine non è affiliata né sostenuta dalla Canonical Ltd .

EDIZIONE SPECIALE

SERIE PROGRAMMAZIONE

PROGRAMMARE

IN PYTHON

VOLUME 6

Page 2: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

Cos'è Full Circle

Full Circle è una rivista gratuita e

indipendente, dedicata alla famiglia

Ubuntu dei sistemi operativi Linux.

Ogni mese pubblica utili articoli

tecnici e articoli inviati dai lettori.

Full Circle ha anche un podcast di

supporto, il Full Circle Podcast, con

gli stessi argomenti della rivista e

altre interessanti notizie.

Si prega di notare che questaedizione speciale viene fornitasenza alcuna garanzia: né chi hacontribuito né la rivista Full Circlehanno alcuna responsabilità circaperdite di dati o danni chepossano derivare ai computer oalle apparecchiature dei lettoridall'applicazione di quantopubblicato.

Come contattarci

Sito web:http://www.fullcirclemagazine.org/

Forum:http://ubuntuforums.org/forumdisplay.php?f=270

IRC:#fullcirclemagazine suchat.freenode.net

Gruppo editoriale

Capo redattore: Ronnie Tucker(aka: RonnieTucker)[email protected]

Webmaster: Rob Kerfia(aka: admin / [email protected]

Modifiche e CorrezioniMike Kennedy, Lucas Westermann,Gord Campbell, Robert Orsino, JoshHertel, Bert Jerred

Si ringrazia la Canonical e i tantigruppi di traduzione nel mondo.

Ecco a voi un altro 'Specialemonotematico'

Come richiesto dai nostri lettori, stiamo assemblando in edizionidedicate alcuni degli articoli pubblicati in serie.

Quella che avete davanti è la ristampa della serie 'Programmare

in Python' parti 32-38, pubblicata nei numeri 60-67.

Vi preghiamo di tenere conto della data di pubblicazione: leversioni attuali di hardware e software potrebbero esserediverse rispetto ad allora. Controllate il vostro hardware e ilvostro software prima di provare quanto descritto nelle guide diqueste edizioni speciali. Potreste avere versioni più recenti delsoftware installato o disponibile nei repository delle vostredistribuzioni.

Buon divertimento!

Gli articoli contenuti in questa rivista sono stati rilasciati sotto la licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stessomodo 3.0. Ciò significa che potete adattare, copiare, distribuire e inviare gli articoli ma solo sotto le seguenti condizioni: dovete attribuire il lavoroall'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") econ 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 stessalicenza 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 dalla Canonical.

Full CircleLA RIVISTA INDIPENDENTE PER LA COMUNITÀ LINUX UBUNTU

Page 3: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.60 6 indice ^

HHOOWW--TTOOScritto da Greg D. Walters II nn iizziiaarree PPyytthhoonn -- PPaarrttee 3322

D evo dire che amo il miotablet Android. Sebbenelo usi tutti i giorni, non èancora un rimpiazzo per il

mio computer. E devo ancheammettere, molto dell'uso che nefaccio è pressapoco lo stesso dichiunque altro: navigare sul web,ascoltare musica, guardare video,giocare e cosi via. Provo solo agiustificarlo avendo alcuni applicazioniche hanno a che fare con la lista dellaspesa e delle cose da fare, per trovaredistributori di benzina economici, cosedivertenti per il nipote etc. Fin ora èveramente un giocattolo perme.Perché usare un simpatico schermosensibile al tocco per la lista dellaspesa? Ammettiamolo... è per glisguardi freddi di invidia che le personemi fanno quando mi vedono spingereil carrello lungo il corridoio toccando ilmio tablet per smarcare gli elementidalla lista. Ahh.. il fattore geekcomanda! Naturalmente, posso usareil retro di una vecchia busta per tenerela mia lista. Ma questo non sarebbealtrettanto figo e geek, ora, vero?

Come per il 99% dei mariti geek nelmondo, sono sposato con una donnanon geek. Una donna amorevole e

meravigliosa, per essere sicuro, manon una geek e quando comincio asbavare per l'ultimo aggeggio, sospirae dice qualcosa tipo” Bene, severamente pensi che abbiamo bisognodi questo ...”. Poi mi da lo stessosguardo che le do io quando staamorevolmente accarezzando ilcinquantesimo paio di scarpe alnegozio. In tutta onestà, non è statodifficile portare il primo tabletin casa nostra. Lo portai permia moglie quando stavafacendo lachemioterapia. Perun po' ha cercato diusare un portatile,ma il calore e ilpeso sul suogrembo eratroppo dopo unpo'. Gli e-book sulcomputer portatileper lei non erano unaopzione, così quandotentava di leggeredoveva destreggiarsi tra illibro, il portatile e il lettoremp3. Tutto questo mentre era legataad un poltrona con i tubi infilati nelbraccio che la stavano riempendo disostanze chimiche. Quando le portai il

tablet, fu la soluzione ideale. Potevaleggere un e-book, ascoltare musica,guardare un programma televisivo,navigare sul web, controllare la suaposta elettronica, aggiornare il suoblog sul cancro, seguire i suoi amici sufacebook e giocare, il tutto su undispositivo leggero e favoloso. Se sistancava, le bastava farlo scivolare dilato tra lei e il lettino reclinabile (o il

letto quando era a casacercando di recuperare leforze). MOLTOmegliodi un portatileingombrante, unlibro, un lettoremp3, untelecomando ealtro ancora.

Mentre siriempiva disostanzechimiche nocive,ho voluto

impadronirmi di unasedia e di un tavolo

nell'angolo della stanza deltrattamento, vicino ad una presa dicorrente e provare a lavorare con mioportatile vecchio di sei anni. Tra iprogetti, volevo fare qualche ricerca

sulla programmazione Android. Avevoscoperto che la maggior parte dellaprogrammazione è fatta in Java. Miero quasi rassegnato a impararenuovamente Java quando mi imbatteiin un paio di strumenti chepermettono la programmazionePython per il sistema operativoAndroid. Uno di questi strumenti èchiamato “SL4A”, che sta per Strato diScripting perAndroid. Su questoconcentreremo i prossimi due articoli.In questo articolo ci focalizzeremo sulconfigurare SL4A su Android.

Potreste chiedere perché maivorrei parlare di programmazioneAndroid su una rivista progettata perLinux. Bene, la ragione semplice è cheil cuore di Android è Linux. Tutto ciòche è Android si trova sopra a Linux!

Molte pagine web mostrano comecaricare SL4Anell'emulatore AndroidperDesktop. Vedremo come farloun'altra volta, per ora ci occuperemodel dispositivo Android stesso. Perinstallare SL4A sul proprio dispositivoAndroid, andate pressohttp://code.google.com/p/androidscripting/; troverete il file di installazioneper SL4A. Non siate assolutamente

Page 4: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.60 7 indice ^

HOWTO - INIZIARE PYTHON 32confusi. C'è un codice a barre quadratoad alta densità che dovete premereper scaricare l'APK. Assicuratevi diavere l'opzione “ origini sconosciute"attivata nelle Impostazioni dellaApplicazioni. Si tratta di uno scaricoveloce. Uno volta che lo avetescaricato e installato, andate avanti,trovate l'icona e premetela. Quello chevedrete è una schermata nerapiuttosto deludente che dice“Scripts...No matches found”. Questova bene. Premete il pulsante menu eselezionate Vista. Vedrete un menù.Selezione Interpreti. Quindiselezionate di nuovo menù e poi Add(Aggiungi). Dal menù successivoselezionate Python2.6.2. Vi dovrebbechiedere di avviare una sessione delbrowser per scaricare Python perAndroid. Una volta installato,selezionate Open (Apri). Otterrete unaschermata di menù con le opzioniInstall (Installare), ImportModules(Importare Moduli), Browse Modules(sfoglia moduli) e Uninstall Modules(Disinstalla Moduli). Ora pythonscaricherà e installerà altri moduliaggiuntivi. In aggiunta otterrete alcuniesempi di script. Infine premete ilpulsante indietro e vederete Python2.6.2 installato negli interpreti delloschermo. Toccate ancora sul pulsanteback (indietro) e vedrete una lista dialcuni script di esempio python.

Questo è tutto quello che faremoquesta volta. Ciò che voglio è stimolareil vostro appetito. Esplorate PythonperAndroid. Potreste anche volervisitarehttp://developer.android.com/sdk/index.html per ottenere l'SDKdi Android(il Kit di Sviluppo Software) per ilvostro desktop. Include un emulatoreAndroid in modo da poterci giocare alungo. Configurare l'SDK su Linux èdavvero abbastanza facile, quindi nondovreste avere molti problemi.

“vedrete unaschermata nerapiuttosto deludente[...] Questo va bene.

Greg è il proprietario dellaRainyDay Solutions, LLC, una societàdi consulenza in Aurora, Colorado eprogramma dal 1 972. Ama cucinare,fare escursioni, ascoltare musica epassare il tempo con la sua famiglia.I l suo sito web èwww.thedesignatedgeek.net.

Come includere Accenti dalla tastieradi Barry Smith

S e il vostro sistema Linux è in francese, tedesco o spagnolo e quindirichiede accenti, o occasionalmente avete bisogno di accenti chenon appaiono nella parole inglese, molti utenti non sanno che c'è unmodo molto semplice per farlo dalla tastiera. Le seguenti

combinazioni si applicano solo alla tastiera UK.

Accento acutoPremi AltGr +; (punto e virgola) alza la mano e quindi premi la vocaledesiderata é

Accento circonflessoPremi AltGr +' (apostrofo) alza la mano e quindi premi la vocale desiderata î

Accento gravePremi AltGr +# (cancelletto) alza la mano e quindi premi la vocaledesiderata è

DieresiPremi Alt Gr + [ Alza la mano quindi premi u ü

ñ - Premi Alt Gr + ] Alza la mano quindi premi n ñ

oe- Premi Shift + Alt Gr Alza la mano quindi premi o quindi premi e oe Ilcarattere oe non apparirà fino a che e è premuta.

Per ottenere ¿ e ¡ (punti esclamativi invertiti) che uso sempre in spagnoloprima delle domande e delle esclamazioni, premi ?AltGr + Maiusc,tenendoentrambi i tasti premuti, premi quindi _ (sottolineato) per ¿ o premi ! (puntoesclamativo) per ¡.

Se vuoi qualcuna di queste in maiuscolo, premi Maiusc prima di digitare lalettera.

Page 5: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.61 7 indice ^

HHOOWW--TTOOScritto da Greg D. Walters II nn iizziiaarree PPyytthhoonn -- PPaarrttee 3333

Q uesta volta configureremol'SDKdi Android sul vostrodesktop Linux. Creeremoinoltre un dispositivo virtuale

Android, installeremo SL4Ae python suquesto e faremo un piccolo test.

Per favore siate consapevoli, questonon è qualcosa che voi dovreste farepermacchine che hanno meno di 1 GBdi ram. L'emulatore si mangia unagrande quantità di memoria. Hoprovato su un portatile su cui stavagirando Ubuntu con 51 2 MB di ram.FUNZIONERA' ma è VERAMENTElento.

Qui c'è una lista di quello chefaremo. Andremo passo passo in unminuto.• Installare il JDK6 di Java.• Installare il pacchetto per iniziare conAndroid SDK.• Creare e installare AVD.• Testare AVD, installare SL4Ae Python

In realtà, dovremmo ancheinstallare Eclipse e il plugin AndroidADTper Eclipse, ma, siccome nonvogliamo avere a che fare con Eclipse inquesto insieme di articoli, possiamobypassare questo. Se volete includere

questi passi, date una occhiata ahttp://developer.android.com/sdk/installing.html per vedere tutti i passinell'ordine suggerito. Partiamo.

PASSO 1 – Java JDK6

Da tutto ciò che ho letto e provato,deve essere veramente il rilascio SUN.Open JDK si suppone che non funzioni.Potete trovare informazioni aproposito di ciò nel web, ma qui ci sonoi passi che ho seguito. In un terminale,digitate i seguenti...

sudo add-apt-repositoryppa:ferramroberto/java

sudo apt-get update

sudo apt-get install sun-java6-jdk

Una volta che è stato fatto tutto,dovrete modificare il tuo file bashrc perassegnare la variabile “JAVA_HOME” inmodo che tutto funzionicorrettamente. Ho usato gedit e allafine del file ho aggiunto la seguentelinea

exportJAVA_HOME=”/usr/lib/jvm/java-6-sun1.6.0.06”

Salvate il file e procedete al passo 2.

PASSO 2 –ANDROID SDKPacchetto Iniziale

Ora inizia il divertimento vero eproprio. Dovete andare sudeveloper.android.com/sdk/index.html.Qui è dove si trova l'SDK. Scaricatel'ultima versione per Linux che, almomento in cui sto scrivendo, èandroidsdk_r1 8-linux.tgz. Usando ilGestore degli Archivi, decomprimeteloin un posto conveniente. Io l'ho messonella mia directory home. Tutto vieneeseguito direttamente da questacartella, così voi non avrete bisogno diinstallare nient'altro. Così il percorsoperme è /home/greg/android-sdk-linux. Navigate in questa cartella, quindidentro alla cartella tools. Qui trovereteun file chiamato “android”. Questo èquello che esegue il vero SDK. Hocreato un lanciatore sulla mia scrivania,per renderlo facile da raggiungere.

Ora la parte noiosa. Eseguite il fileandroid e Android SDKManagerpartirà. Verificherà e aggiornerà lepiattaforme che sono disponibili. Viavverto ora che questo processo

richiederà un certo tempo, così nonpreoccupatevi se non avete un sacco ditempo per gestirlo. Per brevità viconsigli di iniziare con una solapiattaforma. Una buona per iniziare èAndroid 2.1 , perché, per la maggiorparte, se si sviluppa per una una vecchiapiattaforma, non ci dovrebbero esserproblemi su una piattaforma più nuova.Avete anche bisogno di impostareopportunamente gli Strumenti.Semplicemente selezionate la casellaaccanto a questi due elementi, quindifare clic sul pulsante di installazione.Una volta che avete ottenuto lapiattaforma di vostra scelta e lostrumento configurato, sarete quasipronti per creare la vostra primamacchina virtuale.

PASSO 3 –Creare econfigurare il vostroprimo AVD

Tornando a Android SDKmanager,selezionate strumenti dal menuprincipale, quindi selezionate ManagarAVDs. Questo aprirà una nuovafinestra. Dal momento che questa è laprima volta, non ci sarà alcundispositivo virtuale configurato.

Page 6: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.61 8 indice ^

HOWTO - INIZIARE PYTHON 33Cliccate sul pulsante Nuovo. Questoapre un'altra finestra dove definiamo leproprietà del dispositivo virtualeAndroid. Qui ci sono i passi perconfigurare un semplice dispositivovirtuale Android.• Assegnate il nome del dispositivo.Questo è importante se avete più di undispositivo.• Impostate il livello della piattaformadi destinazione• Impostate le dimensioni della SD(vedere in seguito).• Impostate la risoluzione delloschermo• Create il dispositivo

Quindi nella casella di testo Nome,digita “Test1 ”. Nella comboboxdell'obiettivo selezionate Android 2.1 –Livello API 7. Nella casella di testo per“SD card! Inserite 51 2 e assicuratevi chela lista discesa mostri “MiB”. Sotto“Skin”, impostare la risoluzione a800x600. (Potete giocare a vostropiacimento con gli altri formati).Finalmente, premete il pulsante“Creare AVD”. Presto verrà visualizzatoun messaggio dicendo che la AVD èstata creata.

Passo 4 –Testare l'AVD einstallare SL4Ae Python

Ora, finalmente, possiamo avere un

po' di divertimento. Evidenziate l'AVDche avete appena creato e cliccate sulpulsante Partenza, nella finestra didialogo che spunta fuori. Ora, doveteaspettare un paio di minuti perché ildispositivo virtuale sia creatoin memoria e che lapiattaforma Androidsia caricata e avviata(parleremo dicome accelerarequesto processonelle successiveesecuzioni).

Una volta chel'AVD si avvia eavete lo schermo“home” davanti avoi, installerete SL4A.Usando il browser o lafinestra di ricerca web diGoogle, sulla schermata inizialecercate “SL4A”. Vai alla pagina deidownload, alla fine trovate la paginaper i download su:http://code.google.com/p/androidscripting/downloads/list.

Scorrete la pagina fino a quandonon arrivate al collegamento sl4a_r5.Aprite il collegamento e toccate ilcollegamento del “sl4a_r5.apk”. Notateche ho detto “toccate” invece di“cliccate“. Cominciate a pensare con ildito per toccare lo schermo, piuttosto

che a fare click con il mouse. Renderàpiù facile la vostra transizione nellaprogrammazione. Vedrete iniziare loscaricamento. Potrebbe esserenecessario tirare giù la barra di notifica

per arrivare al file scaricato.Toccate su questo equindi toccate ilpulsantedell'installazione.

Una volta cheil file è statoscaricato, vi saràpresentatal'opzione diaprirel'applicazionescaricata o toccare

“Fatto” per uscire dalprogramma di

installazione. Qui dovremotoccare “Apri”.

Ora SL4Apartirà. Probabilmentevedrete una finestra di dialogo che vichiede se consentite di utilizzare ilmonitoraggio. O accettate o rifiutate,questo spetta a voi. Prima di andareoltre dovreste conoscere alcunescorciatoie da tastiera che vi aiuterannonegli spostamenti. Dal momento chenon avete un reale dispositivo Android,pulsanti come Indietro, Home e Menunon sono disponibili. Avrete bisogno diloro per navigare. Ecco alcuni dei

collegamenti importanti.

Indietro-EscapeHome-HomeMenu-F2

Ora dovrete scaricare e installarepython in SL4A. Per fare questo, primatoccate menu (premete F2).Selezionate “View” (Visualizza) dalMenu. Ora selezionate“Interpreters”(Interpreti). Sembra chenon sia successo niente ma toccateMenu ancora (F2), poi selezionate“Add” (Aggiungere) dal menu acomparsa. Ora scorrete verso il basso eselezionate “Python 2.6.2”. Questoscaricherà il pacchetto di base perPython perAndroid. Installate ilpacchetto e poi apritelo. Vi sarannopresentate quattro opzioni. Install(Installa), ImportModules (ImportaModuli), Browse Modules (SfogliaModuli), Uninstall Module (DisinstallaModuli). Toccate su Installa. Questofarà partire, scaricare e installare tutti ipezzi della ultima versione di PythonperAndroid. Ciò potrà richiederequalche minuto.

Una volta che tutto ciò è statocompletato, toccate Back (tasto Esc)fino ad arrivare allo schermo degliInterpreti SL4A. Ora tutto è statocaricato per noi per giocare con Pythoncon Android. Toccate Python 2.6.2, e

Page 7: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.61 9 indice ^

Greg è il proprietario della RainyDaySolutions, LLC, una società di consulenzain Aurora, Colorado e programma dal1 972. Ama cucinare, fare escursioni,ascoltare musica e passare il tempo conla sua famiglia. Il suo sito web èwww.thedesignatedgeek.net.

HOWTO - INIZIARE PYTHON 33sarete nella shell Python “standard”.Questa è come la vostra shell standarddel vostro pc fisso. Digitate le seguentitre linee una alla volta nella shell.Assicuratevi di aspettare per il prompt“>>>” ogni volta.

import android

droid = android.Android()

droid.makeToast(“Hello fromPython on Android”)

Dopo aver digitato l'ultima linea epremuto Invio, vedrete un casella con ibordi arrotondati al centro della shellche dice “Hello from Python onAndroid”. Questo è quello che fa ilcomando “droid.makeToast”.

Avete scritto il vostro primo scriptPython perAndroid. Pulito, huh?

Ora create un collegamento sullaschermata principale di Android.Toccate la chiave Home (pulsanteHome). Se voi scegliete la piattaforma2.1 , dovreste vedere una barra ascorrimento sulla destra dello schermo.Se si sceglie una altra piattaforma,potrebbe essere un quadrato o unrettangolo costituito da piccoliquadrati. Ad ogni modo ottenete laschermata delle Apps (Applicazioni).Toccate questo e trovate l'icona SL4A.Ora eseguite un “tocco lungo”, che vi

creerà un collegamento sullaschermata iniziale. Spostate ilcollegamento dove preferite.

Successivamente, creeremo ilnostro primo script salvato. Tornateindietro a SL4A. Dovrebbe esservipresentato con gli script di esempio chearrivano con Python perAndroid.Toccate il pulsante menu e selezionate“Add” (Aggiungi). Selezionate “Python2.6.2” dalla lista. Verrà presentatol'editor dello script. Nella partesuperiore c'è la casella per il nome delfile con l'estensione “.py” già compilata.Qui di seguito c'è la finestra dell'editorche ha già inserito per noi le prime duerighe del programma. (Ho incluso sottoin corsivo in modo da poter controllare.Abbiamo anche usato queste due lineenel nostro primo esempio).

import android

droid = android.Android()

Adesso inseriamo le seguenti duerighe nello script Python.

uname =droid.dialogGetInput(“What’syour name?”)

droid.makeToast(“Hello %s fromPython on Android”) %uname.result

La prima nuova linea creerà una

finestra di dialogo(droid.dialogGetInput()) che chiede ilnome dell'utente. La risposta èrestituita al nostro programma inuname.result. Abbiamo già usato lafunzione droid.makeToast().

Nominate il file andtest1 .py e quinditoccate Done (Fatto) e toccate “Save &Run”. Se tutto ha funzionato, sidovrebbe vedere una finestra didialogo che chiede il vostro nome.Dopo che lo avete inserito, dovrestevedere un avviso sul fondo delloschermo che dice “Hello, Tuo Nomefrom Python on Android”.

Questo è tutto per questa volta. Perora, c'è una TONNELLATAdidocumentazione su SL4Adisponibilegratuitamente sul web. Potete giocareun po' da soli fino alla prossima volta. Visuggerisco di iniziare andando suhttp://code.google.com/p/androidscripting/wiki/Tutorials.

O'Reilly are looking forward tocelebrating Velocity's 5th Year with youJune 25-27, at the Santa ClaraConvention Center. You'll meet thesmartest people working in webperformance and operations at theO'Reilly Velocity Conference. Web andmobile users expect betterperformance than ever before. Tomeet, and exceed, their expectations,you need to master a daunting array ofweb performance, operations, andmobile performance issues. Velocityoffers the best opportunity to learn thenewest info on what you need to knowto build a faster and stronger web.

Take advantage of this rare opportunityto meet face-to-face with a cadre ofindustry leaders who are taking webperformance and operations to the nextlevel. Velocity packs a wealth of bigideas, know-how, and connections intothree concentrated days. You'll be ableto apply what you've learnedimmediately and you'll be well preparedfor what lies ahead with four in-depthtracks covering the key aspects of webperformance, operations, mobileperformance, and Velocity culture.

Velocity has sold out the last two years,so if you want to reserve your spot atVelocity 201 2, register now and save anadditional 20% with code FULLCIR.

Page 8: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.62 8 indice ^

HHOOWW--TTOOScritto da Greg D. Walters II nn iizziiaarree PPyytthhoonn -- PPaarrttee 3344

Q uesta volta, finiremo diusare SL4A. Faremo unprogramma più grande epoi lo spediremo alla

macchina virtuale tramite ADB.

Diamoci da fare con il nostro primocodice. In questo, proveremo alcunidei “widgets” che sono disponibili a noiquando usiamo SL4A. Cominciate dalvostro desktop usando il vostro editorpreferito.

Inserite il codice mostrato in alto adestra e salvatelo (ma non provate aeseguirlo) come “atest.py”.

La prima linea importa la libreriaandroid. Creiamo una istanza di questanella seconda linea. La linea 3 crea emostra una finestra di dialogo con iltitolo “Hello”, il prompt di “quale è iltuo nome?”, una casella di testo perl'utente per inserire il suo nome e duepulsanti “OK” e “Cancel”. Una volta chel'utente preme “OK”, la risposta èritornata nella variabile uname.L'ultima linea (fino ad ora) quindi dice“Hello {username} from python onAndroid!”. Questo non è nuovo,abbiamo fatto questo prima. Oraaggiungeremo più codice (sopra).

Salvate il vostro codice comeatest1 .py. Lo invieremo alla nostramacchina virtuale dopo che avremodiscusso cosa fa.

Date una occhiata alle primequattro linee che abbiamo appenainserito. Abbiamo creato un dialogo ditipo alert chiedendo “Would you liketo play a game?” (ndt “Vorresti giocareuna partita?”). Nel caso di un dialogo ditipo alert, non c'è nessuna casella perinserire del testo. Le due lineesuccessive dicono di creare due

pulsanti, uno con il testo “Yes”, che èun pulsante “positivo” e uno con iltesto “No” un pulsante “negativo”. Ipulsanti positivi e negativi siriferiscono alla risposta ritornata –o“positiva” o “negativa“. La lineasuccessiva quindi mostra il dialogo. Lesuccessive sette linee aspettano peruna risposta dell'utente.

Creiamo un semplice ciclo (whileTrue:) che aspetta per una rispostafino a 1 0 secondi usando la chiamatadroid.eventWait(value). La risposta (sia

“positiva” che “negativa”) saràritornata nella – avete indovinato -variabile di risposta. Se risposta ha ilnome del “dialogo”, allora usciremodal ciclo e ritorneremo la risposta. Senon è successo niente prima che iltimeout avvenga, semplicementeusciremo dal ciclo. La informazioneaffettivamente restituita nellavariabile di risposta è qualcosa tipoquesto ( assumendo che il pulsante“positivo” o “Yes” sia stato premuto) ...

{u’data’: {u’which’:u’positive’}, u’name’:

import android

droid = android.Android()uname = droid.dialogGetInput("Hello","What's your name?")droid.makeToast("Hello %s from python on Android!" % uname.result)

droid.dialogCreateAlert(uname.result,"Would you like to play a game?")droid.dialogSetPositiveButtonText('Yes')droid.dialogSetNegativeButtonText('No')droid.dialogShow()while True: #wait for events for up to 10 seconds...

response = droid.eventWait(10000).resultif response == None:breakif response["name"] == "dialog":break

droid.dialogDismiss()

Page 9: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.62 9 indice ^

HOWTO - INIZIARE PYTHON 34u’dialog’, u’time’:1339021661398000.0}

Potete vedere che il valore èpassato nel dizionario dati, la chiavedel dialogo è nel dizionario “name”, ec'è un valore 'time' che non ci interessaqui.

Infine dobbiamo chiudere lafinestra di dialogo.

Prima di inviare il nostro codice allamacchina virtuale, dobbiamo farpartire la macchina virtuale. Avviate ilvostro emulatore Android. Una voltache si è avviato, notate che la barra deltitolo ha quattro cifre all'inizio deltitolo. Questa è la porta che lamacchina sta ascoltando. Nel mio caso(e probabilmente anche nel vostro) è5554.

Ora spingiamolo nella nostramacchina virtuale. Aprite una finestradi terminale e muovetevi nella cartellain cui avete salvato il codice.Assumendo che abbiate configurato ilpercorso per includere l'SDK, digitate

adb devices

Questo chiede a adb di mostraretutti i dispositivi che sono connessi.Questo può includere non solol'emulatore, ma anche smartphone,

tablet o altri dispositivi Android.Dovreste vedere qualcosa comequesto ...

List of devices attachedemulator5554 device

Ora siamo sicuri che il nostrodispositivo è attaccato, vogliamospingere la applicazione neldispositivo. La sintassi è ...

adb push source_filenamedestination_path_and_filename

Così, nel mio caso, sarà ...

adb push atest1.py/sdcard/sl4a/scripts/atest1.py

Se tutto funziona correttamente,otterrete un messaggio abbastanzadeludente simile a questo ...

11 KB/s (570 bytes in 0.046s)

Ora sull'emulatore Android, parteSL4A. Dovreste vedere tutti gli scriptpython e traquestidovrestevedereatest1 .py.Toccate(cliccate) suatest1 .py, evedrete un

dialogo popup con sei icone. Dasinistra a destra essi sono “Run ina dialog window”, “Run outsideof a window”, “Edit”, “Save”,“Delete” e “Open in un editoresterno”. In questo momentotoccate (cliccate) sulla icona più asinistra “Run in a dialog window” inmodo da poter vedere cosa accade.

Vedrete il primo dialogo che chiedeil vostro nome. Inserite qualcosa nellacasella e toccate (cliccate) il pulsante“OK”. Quindi vedrete il dialogo di alert.Toccate (cliccate) su uno dei pulsantiper chiudere la finestra di dialogo. Nonstiamo ancora guardando le rispostecosì non importa quale scegliete. Oraaggiungeremo dell'altro codice (inaltro a destra).

Sono sicuro che si può capire chequesto pezzo di codice semplicementecontrolla la risposta, e, se è “None” acausa di un timeout, semplicementestampiamo “Timed out”. E, se in realtà

è qualcosa che vogliamo, alloraassegniamo i dati alla variabile rdialog.Ora aggiungiamo il prossimo pezzettodi codice (sotto) ...

Questa parte del codice guarderà idati passati indietro dall'eventopulsante-premuto. Controlliamo se larisposta ha un una chiave “which” e, inquesto caso, si tratta di una legittimapressione di pulsante per noi.Controlliamo quindi se il risultato èuna risposta “positiva” (pulsante 'Ok').Se è così creeremo una altra finestra diavviso, ma questa volta si aggiungeràun elenco di elementi da cui l'utentepotrà scegliere. In questo caso,offriamo all'utente di selezionare daun elenco comprendenteCheckers,Chess, Hangman, and

if response==None:print "Timed out."

else:rdialog=response["data"]

if rdialog.has_key("which"):result=rdialog["which"]if result=="positive":

droid.dialogCreateAlert("Play a Game","Select a game to play")droid.dialogSetItems(['Checkers','Chess','Hangman','Thermal

Nuclear War']) # 0,1,2,3droid.dialogShow()resp = droid.dialogGetResponse()

Page 10: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.62 1 0 indice ^

Greg è il proprietario della RainyDaySolutions, LLC, una società di consulenzain Aurora, Colorado e programma dal1 972. Ama cucinare, fare escursioni,ascoltare musica e passare il tempo conla sua famiglia. Il suo sito web èwww.thedesignatedgeek.net.

HOWTO - INIZIARE PYTHON 34Thermal NuclearWar, e assegniamo ilvalore da 0 a 3 per ogni elemento.(Questo inizio vi sembra familiare? Sì èda un film). Mostriamo quindi lafinestra di dialogo e aspettiamo per larisposta. La parte della risposta cuisiamo interessati è in forma di undizionario. Supponendo che l'utenteabbia toccato ( cliccato) su Chess ( ndtScacchi), la risposta risultante risultacome questa ...

Result(id=12,result={u’item’:1},error=None)

In questo caso quello che ciinteressa davvero è la porzione delrisultato dei dati restituiti. La selezioneè #1 ed è tenuta nella chiave 'item'.

Ecco la parte successiva del codice ( inalto a destra) ...

Qui controlliamo se la risposta ha lachiave “item”, e, se è così,assegniamola alla variabile “sel”. Orausiamo un ciclo se/altrimenti se/altrimenti per controllare i valori egestire qualsiasi cosa sia statoselezionato. Usiamo la funzionedroid.makeToast permostrare larisposta. Naturalmente, poteteaggiungere il vostro codice qui. Oraper terminare il codice (in basso adestra)

Come potete vedere,semplicemente rispondiamo agli altritipi di pulsanti premuti qui.

Salvate, spingete e eseguite ilprogramma.

Come potete vedere, SL4A vi da lacapacità di fare applicazione “Rese con

interfaccia grafica”, ma nonapplicazioni completamente grafiche.Questo comunque non dovrebbetrattenervi dall'andare avanti e iniziarea scrivere i vostri programmi perAndroid. Non aspettatevi di metterlisu nel “market”. La maggior partedelle persone vogliono applicazioni ditipo completamente grafico.Guarderemo a queste la prossimavolta. Per ulteriori informazioni suSL4A, semplicemente fate una ricercasul web e troverete molti tutorial emaggiori informazioni.

Comunque, potete spingere

direttamente sul vostro smartphone otablet nello stesso modo. Come alsolito il codice è stato messo supastebin ahttp://pastebin.com/REkFYcSU

Arrivederci alla prossima.

if resp.result.has_key("item"):sel = resp.result['item']if sel == 0:

droid.makeToast("Enjoy your checkers game")elif sel == 1:

droid.makeToast("I like Chess")elif sel == 2:

droid.makeToast("Want to 'hang around' for a while?")else:

droid.makeToast("The only way to win is not to play...")

elif result=="negative":droid.makeToast("Sorry. See you later.")

elif rdialog.has_key("canceled"):print "Sorry you can't make up your mind."

else:print "unknown response=",response

print "Done"

Page 11: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.63 7 indice ^

HH OOWW--TTOOScritto da Greg D. Walters II nn iizziiaa rree PPyytthh oonn -- PPaa rrttee 33 55

Q uesta volta, stiamo perprendere un piccoladeviazione dalla nostraesplorazione della

programmazione Android eguardiamo ad un nuovo frameworkper programmare GUI chiamato Kivy.Dovrete andare avanti ahttp://kivy.org e scaricare e installareil pacchetto prima di fare troppo perl' installazione di questo mese. Leistruzioni per l' installazione su Ubuntupossono essere trovate all' indirizzohttp://kivy.org/docs/installation/installation-ubuntu.html.

Prima di tutto, Kivy è una libreriaopen source che fa uso di displaymultitouch. Se questo non èabbastanza “cool” è anchemultipiattaforma, ciò significa chefunzionerà su Linux, Windows, MacOSX, IOS e Android. Ora potete capireperché stiamo parlando di questo. Maricordate, per la maggior parte,qualsiasi cosa voi codifichiate usandoKivy, può funzionare su qualsiasi diqueste piattaforme senza ricodificare.

Prima di andare troppo avanti,fatemi dire un paio di cose. Kivy èVERAMENTE potente, vi fornisce un

nuovo insieme di strumenti per fare lavostra programmazione GUI . Dopo chetutto questo è stato detto, Kivy èanche abbastanza complicato dagestire. Siete limitati ai widget che vivengono forniti. In aggiunta non c'èalcun strumento GUI per progettareGUI con Kivy, così dovete fare unGRANDE lavoro di pre-pianificazioneprima che proviate a fare qualcosa dicomplicato. Inoltre ricordate che Kivyè continuamente sotto sviluppo, cosìle cose possono cambiarerapidamente. Finora non ho trovatonessuno del mio codice di prova che èstato rotto da una nuova versione diKivy, ma c'è sempre una possibilità.

Piuttosto che saltare dentro e

creare un nuovo codice questo mese,guarderemo alcuni esempi che sonoforniti con Kivy e, il prossimo mese,scriveremo qualcosa di nostro.

Una volta che avete decompressoKivy nella sua cartella, usate unterminale e andate in quella cartella.La mia è in /home/greg/Kivy-1 .3.0. Oraandate nella cartella degli esempi, equindi nella cartella dei widget.Andiamo a vedere l'esempioaccordion_1 .py.

È veramente semplice, ma mostraun widget veramente pulito. Sotto c'èil codice.

Come potete vedere, le prime tre

righe sono istruzioni di importazione.Qualsiasi widget voi usiate devonoessere importati, e dovete sempreimportare App da kivy.app.

Le otto righe successive sono laclasse principale dell'applicazione. Laclasse è definita, quindi viene creatauna routine chiamata build. Avretesempre una routine 'build' da qualcheparte nei vostri programmi Kivy. Poiassegniamo un oggetto radice dalwidget Accordion. Successivamentecreiamo cinque Accordionitems eassegniamo il loro titolo. Aggiungiamopoi dieci etichette con il testo “verybig content” (ndt “contenutiveramente grandi”) . Aggiungiamoquindi, ciascuna etichetta al widget

from kivy.uix.accordion import Accordion, AccordionItemfrom kivy.uix.label import Labelfrom kivy.app import App

class AccordionApp(App):def build(self):

root = Accordion()for x in xrange(5):

item = AccordionItem(title='Title %d' % x)item.add_widget(Label(text='Very big content\n' * 10))root.add_widget(item)

return root

if __name__ == '__main__':AccordionApp().run()

Page 12: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.63 8 indice ^

HOWTO - INIZIARE PYTHON 35radice e infine ritorniamo l'oggettoradice. Questo in sintesi mostral'oggetto radice nella finestra che Kivyha creato per noi. Finalmente abbiamol' istruzione “if __name__” e quindieseguiamo l'applicazione.

Andiamo avanti e eseguiamo pervedere che cosa fa.

Vedrete in un attimo o due, unafinestra che si apre con cinque barreverticali all' interno. Facendo clic suuna di esse, fa si che si apra rivelandole dieci etichette. Naturalmenteciascuna barra ha lo stesso testo nelledieci etichette, ma voi potete capirecome aggiustarlo.

I l widget Accordion può essereusato per un numero qualsiasi di cose,ma la cosa che mi è sempre venuta inmente è una schermata diconfigurazione... con ciascuna barrache rappresenta un differente insiemedi configurazione.

Poi guarderemo all'esempiotextlign.py. Non è così “sexy” comel'ultimo, ma è un buon esempio che vida alcune importanti informazioni chesaranno utili successivamente.

Prima di guardare il codice,eseguite il programma.

Quello che dovreste vedere è unaetichetta in cima alla finestra, uninsieme di nove box rosse con un testoin una griglia 3X3 e quattro pulsanti infondo della finestra. Come fate clic(toccate) ciascuno dei pulsanti,l'allineamento del testo cambierà. Laprincipale ragione per cui dovrestefare attenzione a questo esempio ècome usare e controllare alcuniimportanti widget e come cambiarel'allineamento all' interno di essi, chenon è completamente intuitivo.

In alto a destra c'è il codice perquesto. Lo suddividerò in pezzi; ilprimo è il codice di importazione (inalto a destra).

Sotto c'è qualcosa di speciale.Hanno creato una classe senza codice.Ne discuterò tra pochi minuti:

class BoundedLabel(Label):

pass

Poi viene creata una classe

chiamata “Selector” (sotto):

class Selector(FloatLayout):

app = ObjectProperty(None)

Ora la classe Applicazione è statacreata.

Qui viene creata la routine 'select' .Viene creato un widget 'GridLayout'(chiamato griglia) , che ha 3 righe e trecolonne. Questa griglia sta percontenere i nove box rosse.

for valign in ('bottom','middle', 'top'):

for halign in ('left','center', 'right'):

Qui abbiamo due cicli , uno piùinterno e uno più esterno.

label = BoundedLabel(text='V:%s\nH: %s' % (valign, halign),

size_hint=(None, None),

halign=halign, valign=valign)

Nel codice sopra, viene creataun'istanza del widget 'BoundedLabel' ,una volta per ciascuna delle novescatole rosse. Potreste fermarvi qui edire “Ma aspetta! Non c'è un widgetBoundedLabel. C'è solo una istruzionedi passaggio dentro“. Bene, sì e no.Stiamo creando una istanza di unwidget fatto su misura. Come ho dettoun poco sopra, ne parleremo un po' dipiù tra un minuto.

Nel blocco di codice (in alto adestra, prossima pagina) esaminiamola variabile 'case' che è passata nellaroutine select.

from kivy.app import Appfrom kivy.uix.label import Labelfrom kivy.uix.gridlayout import GridLayoutfrom kivy.uix.floatlayout import FloatLayoutfrom kivy.properties import ObjectProperty

class TextAlignApp(App):

def select(self, case):

grid = GridLayout(rows=3, cols=3, spacing=10, size_hint=(None, None),pos_hint={'center_x': .5, 'center_y': .5})

Page 13: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.63 9 indice ^

HOWTO - INIZIARE PYTHON 35

Qui la griglia è rimossa, per pulirelo schermo.

if self.grid:

self.root.remove_widget(self.grid)

I l metodo 'bind' imposta ledimensioni e viene aggiunta unagriglia all'oggetto radice.

grid.bind(minimum_size=grid.setter('size'))

self.grid = grid

self.root.add_widget(grid)

Ricordate che nell'ultimo esempioho detto che voi userete quasi sempreuna routine di build. Qui è quella perquesto esempio. L'oggetto radice èstato creato con un widgetFloatLayout. Poi (al centro a destra)chiamiamo la classe Selector percreare un oggetto Selector, poi vieneaggiunto all'oggetto radice einizializziamo la visualizzazionechiamando self.select(0).

Finalmente l'applicazione è prontaper essere eseguita.

TextAlignApp().run()

Ora, prima di potere andare avanti,

dobbiamo chiarire un po' di cose.Primo se voi guardate nella cartellache contiene il file.py noterete unaltro file chiamato textalign.kv.Questo è un file speciale che Kivy usaper permettervi di creare i vostriwidget e regole. Quando la vostraapplicazione Kivy parte, cerca nellastessa directory il file helper.kv. Se c'è,lo carica per primo. Lì è il codice nelfile kv.

La prima riga dice a Kivy qualeversione minima di Kivy deve essereusata per eseguire questaapplicazione.

#:kivy 1.0

Qui viene creato il widgetBoundedLabel. Ciascuna scatola rossanell'applicazione è una BoundedLabel.

'Color' assegna il colore di sfondodel box a rosso (rgb:1 ,0,0) . I l widgetRectangle crea (avete indovinato) unrettangolo. Quando chiamiamo ilwidget BoundedLabel nel codice dellaapplicazione, stiamo passando unaetichetta come genitore. Ladimensione e la posizione (qui nel file.kv) sono assegnate a prescinderedalla dimensione e dalla posizionedella etichetta.

Qui (a destra della pagina

successiva) , vine creato il widgetSelector. Questi quattro pulsantiappaiono in fondo alla finestra nellostesso modo in cui le etichetteattraversano il margine superioredella finestra.

Notate che l'etichetta che realizzail titolo in cima alla finestra ha unaposizione (pos_hint) come top, ha unaltezza di 50 pixel e un carattere didimensione 1 6. Ciascun pulsante ha un

allineamento per il testo al centro.L' istruzione 'on_release' è simile abind, in modo tale che quando ilpulsante viene rilasciato, chiama (inquesto caso) root.app.select con unvalore a seconda del caso.

Si spera che ora questo inizi adavere senso. Potete vedere perchéKivy è così potente.

Parliamo in po' dei due widget,

if case == 0:label.text_size = (None, None)

elif case == 1:label.text_size = (label.width, None)

elif case == 2:label.text_size = (None, label.height)else:label.text_size = label.size

grid.add_widget(label)

def build(self):self.root = FloatLayout()

self.selector = Selector(app=self)self.root.add_widget(self.selector)self.grid = None

self.select(0)return self.root

<BoundedLabel>:canvas.before:

Color:rgb: 1, 0, 0

Rectangle:pos: self.pos

size: self.size

Page 14: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine n.63 1 0 indice ^

Greg è il proprietario della RainyDaySolutions, LLC, una società diconsulenza in Aurora, Colorado eprogramma dal 1 972. Ama cucinare,fare escursioni, ascoltare musica epassare il tempo con la sua famiglia.I l suo sito web èwww.thedesignatedgeek.net.

HOWTO - INIZIARE PYTHON 35GridLayout e FloatLayout, che hopassato prima durante la discussionedel codice di esempio.

GridLayout è un widget genitoreche usa una descrizione riga e colonnaper disporre ogni widget in ciascunacella. In questo caso è una griglia 3X3(come il tavoliere per Tic-Tac-Toe (oNaughts e Crosses)) .

__|__|____|__|__

| |

Quando volete disporre un widgetin un GridLayout, usate il metodoadd_widget. Qui c'è un problema. Nonpotete specificare quale controllo vain quale cella della griglia se nonnell'ordine con cui li aggiungete.Inoltre, ciascun widget è aggiunto dasinistra a destra, dall'alto in basso.Non potete avere una cella vuota;naturalmente potete imbrogliare,lascio a voi capire come.

I l widget FloatLayout sembraessere solo un contenitore genitoreper altri widget figli .

Ho sorvolato su alcuni punti perora. I l mio intento, questa volta, erasemplicemente di eccitarvi sullepossibilità che Kivy ha da offrire. Nellaprossima coppia di articoli,continueremo a esplorare che cosa

Kivy ha per noi, come usare ivari widget e come creare unAPK per pubblicare le nostreapplicazioni per Android.

Fino ad allora esplorateulteriori esempi in Kivy eassicuratevi di andare allepagine delladocumentazione per Kivy ahttp://kivy.org/docs/.

<Selector>:Label:pos_hint: {'top': 1}

size_hint_y: Noneheight: 50

font_size: 16text: 'Demonstration of text valign and halign'BoxLayout:

size_hint_y: Noneheight: 50

ToggleButton:halign: 'center'

group: 'case'text: 'label.text_size =\n(None, None)'on_release: root.app.select(0)state: 'down'

ToggleButton:halign: 'center'

group: 'case'text: 'label.text_size =\n(label.width, None)'on_release: root.app.select(1)

ToggleButton:halign: 'center'group: 'case'

text: 'label.text_size =\n(None, label.height)'on_release: root.app.select(2)

ToggleButton:halign: 'center'group: 'case'

text: 'label.text_size =\n(label.width, label.height)'on_release: root.app.select(3)

Page 15: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine #64 7 indice ^

HHOOWW--TTOOScritto da Greg D. Walters II nn iizziiaarree PPyytthhoonn -- PPaarrttee 3366

Prima di iniziare, voglio farnotare che questo articolosegna tre anni della serieIniziare a Programmare

usando Python. Voglio ringraziareRonnie e l'intera squadra di Full CircleMagazine per tutto il loro supporto especialmente voi, i lettori. Non avreiMAI pensato che sarebbe continuatocosì a lungo.

Voglio inoltre prendere un secondoper notare che ci sono stati alcunicommenti fluttuanti nell'etere secondoi quali, dopo tre anni, la parola “Iniziare”potrebbe essere fuori luogo nel titolodella serie. Dopo tutto, dopo tre anni,siete ancora dei principianti? Bene, acerti livelli, sono d'accordo. Comunquericevo ancora commenti da lettori chedicono di aver appena scoperto questaserie e Full Circle Magazine e chedunque stanno scorrendo indietroall'inizio della serie. Quindi, questiSONO principianti. Così, a partire dal37, toglieremo “Iniziare” dal titolo dellaserie.

Ora passiamo al contenuto vero eproprio di questo articolo…l'approfondimento su Kivy.

Immaginate di suonare la chitarra.Non una immaginaria ma una chitarravera. Comunque, non siete il migliorsuonatore di chitarra e alcuni accordisono problematici per voi. Per esempio,conoscete gli accordi C, E, G e F (ndt:Do, Mi, Sol e Fa) ma alcuni accordi,come F#minore o C#minore, anche sefattibili, sono difficili da fare per levostre dita in una canzone veloce. Checosa fate, specialmente se il concerto èsolo tra un paio di settimane e voiDOVETE essere veloci OGGI? Lasoluzione è usare il capotasto mobile(quella cosa simpatica che si vedequalche volta appesa al manico dellachitarra). Questo fa salire la chiave dellachitarra e potete usare accordidifferenti per armonizzarvi con il restodella banda. Ciò si chiama trasposizione.Alcune volte potete trasporrevelocemente nella vostra testa. Altrevolte è più facile sedersi davanti a unfoglio per farlo se, per esempio,

l'accordo è F#minore e, mettendo ilcapotasto mobile sul tasto 2, potetesemplicemente suonare un Eminore.Ma questo richiede tempo. Facciamoun applicazione che vi permette discorrere semplicemente tra le posizionidei tasti per trovare gli accordi più facilida suonare.

La nostra applicazione saràabbastanza semplice. Un'etichetta per iltitolo, un pulsante con la scala di basecome testo, una vista a scorrimento (unmeraviglioso widget genitore checontiene altri controlli e vi permette di“lanciare” l'interno del controllo perscorrere) che tiene un numero dipulsanti che hanno riposizionato lescale come testo e un pulsante peruscire. Somiglierà a QUALCOSAcome iltesto sotto.

Iniziate con un nuovo file python dalnomemain.py. Questo sarà importante

se e quandodeciderete dicreareun'applicazioneAndroid da Kivy. Aggiungeremo ora leistruzione di importazione che sonomostrate nella prossima pagina in altroa destra.

Notate la seconda linea,“kivy.require(1 .08)”. Questo vipermette di essere sicuri di poter usarele ultime e più importanti chicche cheKivy fornisce. Notate anche che stiamoincludendo un'uscita di sistema (linea3). Includeremo alla fine un pulsanteper l'uscita.

Qui c'è l'inizio della nostra classechiamata “Transpose”.

class Transpose(App):def exit(instance):

sys.exit()

--------------------------------------------------------------------Transposer Ver 0.1

C C#/Db D D#/Eb E F F#/Gb G G#/Ab A A#/Bb B C____________________________________________________________________

1| C#/Db D D#/Eb E F F#/Gb G G#/Ab A A#/Bb B C C#/Db2| D D#/Eb E F F#/Gb G G#/Ab A A#/Bb B C C#/Db D

--------------------------------------------------------------------

Page 16: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine #64 8 indice ^

HOWTO - INIZIARE PYTHON 36Ora lavoriamo sulla nostra routine

di costruzione (in mezzo a destra). Ènecessario per ogni applicazione Kivy.

Questo sembra un po' confuso.Sfortunatamente, l'editor non sempretiene gli spazi corretti perfino con uncarattere mono spaziato. L'idea è che lastringa text1 è una semplice scala cheinizia con la nota “C”. Ciascuna deveessere centrata con 5 spazi. Come iltesto mostrato in basso a destra.

La stringa text2 dovrebbe essere lastessa cosa ma ripetuta. Useremo unospostamento della posizione nellastringa text2 per riempire il pulsantedel testo all'interno del widgetscrollview.

Ora creiamo l'oggetto root (che è lanostra finestra principale) contenenteun widget GridLayout. Se vi ricordateWAY, quando stavamo facendo unaltro sviluppo GUI per Glade, c'era unwidget gridview. Bene il GridLayout quiè pressappoco lo stesso. In questo caso,abbiamo una griglia che ha una colonnae tre righe. In ciascuna di queste cellecreate nella griglia possiamometterealtri widgets. Ricordate, non possiamodefinire dove si dispone un widget senon tramite l'ordine in cui lo piazziamo.

root =GridLayout(orientation='vertica

l',spacing=10,cols=1,rows=3)

In questo caso, la rappresentazioneè come segue ...

-----------------------------(0) title label-----------------------------(1) main button-----------------------------(2) scrollview-----------------------------

La vista a scorrimento contieneelementi multipli, nel nostro casopulsanti. Successivamente, creiamol'etichetta che sarà in cima alla nostraapplicazione.

lbl = Label(text='TransposerVer 0.1',

font_size=20,size_hint=(None,None),size=(480,20),padding=(10,10))

Le proprietà impostate dovrebberoessere abbastanza autoesplicative. Leuniche che potrebbero darvi qualcheproblema potrebbero essere quelle del

padding e del size_hint. Il padding è ilnumero di pixel attorno a un elementoin un riferimento x,y. Presodirettamente dalla documentazioneKivy, size_hint (per X, che è lo stesso perY) è definito come:

Xsize_hint. Rappresentaquantospazio ilwidgetdeveusarenelladirezionedell'asseX, relativamenteallalarghezzadelsuogenitore. SoloLayouteWindowfannousodihint:ilvaloreèinpercentualecomefloatda0. a1., dove1

significal'interadimensionedelgenitore,0.5rappresentail50%.

In questo caso size_hint è impostatoa none, il suo valore predefinito è 1 00%o 1 . Questo sarà più importante (econtorto) più avanti.

Ora definiamo il nostro pulsante"principale" (pagina successiva, in alto adestra). Questo è un riferimento staticoper la scala.

import kivykivy.require('1.0.8')from sys import exitfrom kivy.app import Appfrom kivy.core.window import Windowfrom kivy.uix.button import Buttonfrom kivy.uix.label import Labelfrom kivy.uix.anchorlayout import AnchorLayoutfrom kivy.uix.scrollview import ScrollViewfrom kivy.uix.gridlayout import GridLayout

def build(self):#--------------------------------------------------------------text1 = " C C#/Db D D#/Eb E F F#/Gb G G#/Ab A A#/Bb B C"text2 = " C C#/Db D D#/Eb E F F#/Gb G G#/Ab A A#/Bb B C C#/Db D

D#/Eb E F F#/Gb G G#/Ab A A#/Bb B C C#/Db"#--------------------------------------------------------------

| | | | | | | | | | | |12345678901234567890123456789012345678901234567890123456

C C#/Db E F F#/Gb G G#/Ab A A#/Bb B C

Page 17: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine #64 9 indice ^

Greg è il proprietario della RainyDaySolutions, LLC, una società di consulenzain Aurora, Colorado e programma dal1 972. Ama cucinare, fare escursioni,ascoltare musica e passare il tempo conla sua famiglia. Il suo sito web èwww.thedesignatedgeek.net

HOWTO - INIZIARE PYTHON 36Di nuovo, la maggior parte di

questo dovrebbe essere abbastanzachiaro.

Ora aggiungiamo i widgetall'oggetto root, che è il widgetGridLayout. L'etichetta (lbl) va nellaprima cella, il pulsante (btn1 ) va nellaseconda.

#----------------------------root.add_widget(lbl)root.add_widget(btn1)#----------------------------

Ora arriviamo a del codice piùdifficile da comprendere. Creiamo unaltro oggetto GridLayout e lochiamiamo “s”. Lo colleghiamoall'altezza del prossimo widget che, inquesto caso, sarà la ScrollView, NON ipulsanti.

s = GridLayout(cols=1, spacing= 10, size_hint_y = None)s.bind(minimum_height=s.setter('height'))

Ora (nel centro a destra) creiamo 20pulsanti, riempiamone la proprietàtesto e quindi aggiungiamoli allaGridLayout.

Adesso creiamo la ScrollView, neimpostiamo la dimensione e laaggiungiamo alla GridLayout root.

sv =ScrollView(size_hint=(None,None), size=(600,400))

sv.center = Window.center

root.add_widget(sv)

Infine aggiungiamo laGridLayout che tiene tutti inostri pulsanti nella ScrollViewe che ritorna l'oggetto rootall'applicazione.

sv.add_widget(s)

return root

Infine, abbiamo la nostraroutine “if __name__”. Notateche la stiamo configurando perla possibilità di usarel'applicazione come unaapplicazione android.

if __name__ in('__main__','__android__'):

Transpose().run()

Ora potrete stupirvi del perché housato pulsanti invece di etichette pertutti i nostri oggetti testuali. Ciò perché,per impostazione predefinita, leetichette in Kivy non hanno alcun tipodi bordo visibile. Giocheremo conquesto nella prossima puntata.Aggiungeremo inoltre un pulsante per

l'uscita e qualche altra piccola cosa.

Il codice sorgente può esseretrovato su PasteBin pressohttp://pastebin.com/hsicnyt1 .

Fino alla prossima volta, divertitevi evi ringrazio per avermi sopportato pertre anni!

btn1 = Button(text = " " + text1,size=(680,40),size_hint=(None, None),halign='left',font_name='data/fonts/DroidSansMono.ttf',padding=(20,20))

for i in range(0,19):if i <= 12:

if i < 10:t1 = " " + str(i) + "| "

else:t1 = str(i) + "| "

else:t1 = ''text2 = ''

btn = Button(text = t1 + text2[(i*5):(i*5)+65],size=(680, 40),size_hint=(None,None),halign='left',font_name='data/fonts/DroidSansMono.ttf')

s.add_widget(btn)#--------------------------------------------------------------

Page 18: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine #65 6 indice ^

HHOOWW--TTOOScritto da Greg D. Walters PPrrooggrraammmmaarree iinn PPyytthhoonn -- PPaarrttee 3377

Q uestomese finiremo ilprogramma traspositore cheabbiamo scritto in Kivy. Speroche abbiate salvato il codice

dall’ultima volta perchè costruiremosopra questo. Se non è così, alloraprendete il codice dal numero 64 diFCM.

Incominciamo ricapitolando quelloche abbiamo fatto la volta scorsa.Abbiamo creato una applicazione chepermette a un chitarrista di trasporrevelocemente da una chiave all’altra. Ilfine ultimo è quello di essere in grado dieseguire questa applicazione non solo in

Linuxo in una scatola Windowsmaanche altrettanto bene sui dispositiviAndroid. Prendo la mia sulmio tabletogni volta che vado con la band per farepratica. Stavo per trattare con lapreparazione del nostro progetto perandroid, ma alcune cose sono cambiatenelmetodo per farlo, così lavoreremo suquesto la prossima settimana.

L’applicazione, come la abbiamolasciata l’ultima volta sembra comequella mostrata sotto a sinistra.

Quando abbiamo fatto, dovrebbesembrare come lo schermo sotto a

destra.

La prima cosa che noterete è che cisono delle etichette blu piuttosto chequelle grigie noiose. Il prossimo è che cisono tre pulsanti. Infine le etichettescorrevoli sono più vicine all’interalarghezza della finestra. Oltre a questo èquasi dal tutto ( visualmente) lo stesso.

Uno dei pulsanti è un pulsante“about” che vi farà saltar fuori dellesemplici informazioni, ma spiega comefare un semplice popup. Uno deipulsanti è un pulsante peruscire. L’altropulsante inverte l’etichetta di testo perrendere facile la trasposizione da

pianoforte a chitarra o da chitarra apianoforte.

Incominciamo creando un file .kv(sopra a destra). Questo è quello che ci

#:kivy 1.0#:import kivy kivy

<BoundedLabel>:canvas.before:Color:

rgb: 0, 0, 1Rectangle:

pos: self.possize: self.size

Page 19: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine #65 7 indice ^

HOWTO - PROGRAMMARE IN PYTHON 37da le etichette colorate. E’ un fileveramente semplice.

Le prime due linee sonoobbligatorie. Semplicemente diconoquale versione di Kivy aspettarsi. Poicreiamo un nuovo tipo di etichettachiamato “BoundedLevel”. Il colore èassegnato con valori RGB (tra 0 e 1 , chepuò essere considerato come il 1 00%) ecome potete vedere il valore blu èassegnato al 1 00 percento. Creiamoinoltre un rettangolo che è la veraetichetta: salvate questo come“transpose.kv”. Dovete utilizzare il nomedella classe che utilizzeremo.

Ora che avete completato questo,aggiungete le seguenti linee giustoprima della classe transpose al filesorgente dall’ultima volta.

class BoundedLabel(Label):

pass

Per fare in modo che tutto funzioni,tutto ciò di cui abbiamo bisogno è unadefinizione. Prima di andare avanti,aggiungete la seguente linea allasezione import:

from kivy.uix.popup import Popup

Questo ci permette di creare ilpopup dopo. Ora nella classe Transpose,

proprio dentro alla routine delladefinizione della costruzione, piazzate ilcodice sopra a destra.

La routine LoadLabels ci darà leetichette colorate (BoundedLabel) e lacapacità di invertire. Avete visto lamaggiorparte la volta scorsa. Passiamoun valore al parametro “w” perdeterminare quale testo deve esseremostrato. La linea l=BoundedLabel èmolto simile alla stessa linea dell’ultimavolta, con l’eccezione che, questa volta,stiamo usando un widgetBoundedLabelinvece di un widgetButton. LaLoadlabels sarà principalmente

def LoadLabels(w):if w == 0:

tex0 = self.text1tex1 = self.text2

else:tex0 = self.text3tex1 = self.text4

for i in range(0,22):if i <= 12:

if i < 10:t1 = " " + str(i) + "| "

else:t1 = str(i) + "| "t = tex1

else:t1 = ''t = ''

l = BoundedLabel(text=t1+t[(i*6):(i*6)+78], size=(780, 35),size_hint=(None,None),halign='left',font_name='data/fonts/DroidSansMono.ttf')

s.add_widget(l)

def Swap(instance):if self.whichway == 0:

self.whichway = 1btnWhich.text = "Guitar --> Piano"btn1.text = " " + self.text3s.clear_widgets()LoadLabels(1)

else:self.whichway = 0btnWhich.text = "Piano --> Guitar"btn1.text = " " + self.text1s.clear_widgets()LoadLabels(0)

Page 20: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine #65 8 indice ^

HOWTO - PROGRAMMARE IN PYTHON 37

chiamata dalla prossima routine, Swap.Piazzate questo codice (mostrato adestra) sotto LoadLabels.

Voi potete vedere che questaroutine è autoesplicativa. Usiamo unavariabile (self.whichway) perdeterminare “in quale modo” leetichette sono visualizzate… dallaChitarra al Pianoforte o dal Pianofortealla Chitarra.

Assicuratevi di salvare il vostrolavoro a questo punto dato che stiamoper faremolti cambiamenti da qui inavanti.

Sostituite le linee che definisconotext1 e text2 con le lineemostratesopra.

Assegniamo a zero self.whichwayche sarà il nostro valore di default per laprocedura di inversione. Quindidefiniamo quattro stringhe invece delledue che avevamo l’ultima volta. Potetenotare che le stringhe text3 e text4

sono semplici inversioni di text1 e ditext2.

Ora aggiustiamo la linea contenentela definizioni di base. Cambiatela da

root =GridLayout(orientation='vertical', spacing=10, cols=1,rows=3)

a

root =GridLayout(orientation='vertical', spacing=6, cols=1, rows=4,row_default_height=40)

Abbiamo cambiato la spaziatura da1 0 a 6 e assegnato l’altezza predefinitadella riga a 40 pixel. Cambiate il testo perl’etichetta (successiva linea) a“text=’TransposerVer0.8.0’”. Tutto ilresto resta lo stesso su questa linea.

Ora cambiate la linea delladefinizione dei pulsanti da …

btn1 = Button(text = " " +text1,size=(680,40),

size_hint=(None,None),halign='left',font_name='data/fonts/DroidSansMono.ttf', padding=(20,20))

a:

btn1 = Button(text = " " +self.text1,size=(780,20),size_hint=(None, None),halign='left',font_name='data/fonts/DroidSansMono.ttf', padding=(20,2),background_color=[0.39,0.07,.92,1])

Notate che ho cambiato laformattazione della prima definizioneper chiarezza. I grandi cambiamenti sonoil cambiamento delle dimensioni da680,40 a 780, 20 e il colore di sfondo peril pulsante. Ricordate che possiamocambiare il colore di sfondo per i pulsantima non per le etichette.

Poi, definiamo trewidgetAnchorLayout per i tre pulsanti cheaggiungeremo più tardi. Li ho nominateal0 (AnchorLayout0) , al1 e al2. Abbiamoanche aggiunto il codice per il Popup

About e definito i nostri pulsantiinsieme con le definizioni dicollegamento

Questo èmostrato sulla prossimapagina in alto a sinistra.

Trovate la linea “s = GridLayout” ecambiate la spaziatura da 1 0 a 4. Poiaggiungete la seguente linea dopo lalinea s.bind (a destra prima del ciclo for):

LoadLabels(0)

Questo chiama la routine LoadLabelscon il nostro “which” di default a 0.

Poi, commentate per intero il codicedel ciclo. Questo inizia con “for i inrange(0,1 9):” e finisce con“s.add_widget(btn)”. Noi non abbiamobisogno di questo, poiché la routineLoadLabels fa questo pernoi.

Ora salvate il vostro codice e provatea eseguirlo. Dovreste vedere unprofondo pulsante viola in cima e lenostre simpatiche BoundLabels blu. Inpiù noterete che le BoundLabels nella

self.whichway=0

self.text1 = " C | B |A#/Bb| A |G#/Ab| G |F#/Gb| F | E |D#/Eb| D |C#/Db| C |"

self.text2 = " C | B |A#/Bb| A |G#/Ab| G |F#/Gb| F | E |D#/Eb| D |C#/Db| C | B |A#/Bb| A |G#/Ab| G |F#/Gb| F | E |D#/Ab| D |C#/Db| C |"

self.text3 = " C |C#/Db| D |D#/Eb| E | F |F#/Gb| G |G#/Ab| A |A#/Bb| B | C |"

self.text4 = " C |C#/Db| D |D#/Eb| E | F |F#/Gb| G |G#/Ab| A |A#/Bb| B | C |C#/Db| D |D#/Eb| E | F |F#/Gb| G |G#/Ab| A |A#/Bb| B | C |C#/Db|"

Page 21: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine #65 9 indice ^

Greg è il proprietario della RainyDaySolutions, LLC, una società di consulenzain Aurora, Colorado e programma dal1 972. Ama cucinare, fare escursioni,ascoltare musica e passare il tempo conla sua famiglia. Il suo sito web èwww.thedesignatedgeek.net

HOWTO - PROGRAMMARE IN PYTHON 37

finestra di scorrimento sono più vicine,che rendemolto più facile da leggere.

Abbiamo quasi finito con il nostrocodicema abbiamo ancora un po’ dicose da fare. Dopo la linea “sv =ScrollView” aggiungete la seguentelinea …

sv.size = (720, 320)

Questo assegna la dimensione delwidget ScrollViewa 720 per320 che lofa più largo nella finestra principale. Oraprima della linea “return root”aggiungete il codicemostrato in alto adestra.

Qui abbiamo aggiunto i tre pulsantiai widgetAnchorLayout. Create unGridLayout per contenere gli Anchor

Layout, e quindi finalmente aggiungetegli AnchorLayout alla GridLayout.

Tornate indietro giusto sotto allaroutine “defSwap” e aggiungete iseguenti …

def ShowAbout(instance):popup.open()

Questo è tutto. Salvate ed eseguite ilcodice. Se cliccate sul pulsante About,vedrete il semplice popup. Premete inqualsiasi punto al di fuori del popup perfare in modo che scompaia. Ora il vostrocodice è scritto. Potete trovare tutto ilcodice scritto ahttp://pastebin.com/GftmjENs

Ora dobbiamo creare il nostropacchetto Android … ma doveteaspettare la prossima volta.

Se volete configurare e provare aimpacchettare perAndroid prima delprossimomese dovete andare suhttp://kivy.org/docs/guide/packaging-android.html per la documentazione suquesto: assicuratevi di seguire ladocumentazione con cura.

Arrivederci al prossimomese

al0 = AnchorLayout()al1 = AnchorLayout()al2 = AnchorLayout()popup = Popup(title='About Transposer',

content=Label(text='Written by G.D. Walters'),size_hint=(None,None),size=(400,400))

btnWhich = Button(text = "Piano --> Guitar",size=(180,40),size_hint=(None,None))

btnWhich.bind(on_release=Swap)btnAbout = Button(text="About",size=(180,40),

size_hint=(None,None))btnAbout.bind(on_release=ShowAbout)btnExit = Button(text="Exit", size=(180,40),

size_hint=(None,None))btnExit.bind(on_release=exit)

al0.add_widget(btnWhich)al1.add_widget(btnExit)al2.add_widget(btnAbout)bgl = GridLayout(orientation='vertical',

spacing=6, cols=3,rows=1,row_default_height=40)

bgl.add_widget(al0)bgl.add_widget(al1)bgl.add_widget(al2)

Page 22: dl.fullcirclemagazine.orgdl.fullcirclemagazine.org/issuePY06_it.pdf · dl.fullcirclemagazine.org ... 'kia

full circle magazine #67 8 i ndi ce ^

HHOOWW--TTOOScritto da Greg Walters PPrrooggrraammmmaarree iinn PPyytthhoonn :: PPaarrttee 3388

Come ho promesso nellaparte 37, prenderemo la appdel traspositore cheabbiamo creato, e creeremo

un APKper installarlo sul vostrodispositivo Android.

Prima di cominciare, assicuriamocidi avere tutto pronto. Per prima cosaabbiamo bisogno dei due file cheabbiamo creato l'ultima volta in unacartella a cui voi potete accederefacilmente. Chiamatela “transposer”.Createla nella vostra home directory,quindi copiate i due file (transpose.kv etranspose.py) in questa cartella. Orarinominate transpose.py in main.py.Questa parte è importante.

Poi abbiamo bisogno di fareriferimento alle istruzioni di packagingdi Kivy in un browserweb. Ilcollegamento èhttp://kivy.org/docs/guide/packaging-android.html. Useremo questo per iprossimi passi, ma non esattamentecome intendevano le persone di Kivy.Dovreste avere l'SDK android dallelezioni precedenti. Idealmenteseguirete le istruzioni e vi procureretetutto il software che è elencato qui, maper i nostri propositi, potete

semplicemente seguire qui. Dovetescaricare il software python-for-android. Aprite la finestra del terminalee digitate i seguenti comandi...

git clonegit://github.com/kivy/python-for-android

Questo scaricherà e configurerà ilsoftware di cui abbiamo bisogno percontinuare. Ora nella finestra delterminale, cambiate la vostra directoryalla cartella python-for-android/dist/default folder.

Ora troverete un file chiamatobuild.py. Questo è quello che farà tuttoil lavoro per noi. Ora arriva la magia.

Il programma build.py prenderà variargomenti da linea di comando ecreerà l'APKper voi. Sotto trovate lasintassi usata per build.py presa

direttamente dalla documentazioneKivy.

Per il nostro scopo, useremo ilseguente comando (il carattere “\” è uncarattere per indicare la continuazionedi linea):

./build.py --dir ~/transposer--packageorg.RainyDay.transposer \--name "RainyDay Transposer"--version 1.0.0 debug

Diamo un'occhiata ai pezzi delcomando...

./build.py –questa è l'applicazione--dir ~/transposer –questa è la

directory dove si trova il codice dellanostra applicazione.

--packageorg.RainyDay.transposer –questo è ilnome del pacchetto

--name “RainyDayTransposer” –questo è il nome della applicazione chesarà mostrato nel drawer (o cassetto)delle applicazioni.

--version 1 .0.0 – la versione dellanostra applicazione

debug –questo è il livello dellarelease (debug o release)

Una volta che lo avete eseguite,assumendo che tutto funzioni come cisi aspetta, dovreste avere un certonumero di file nella cartella /bin.Quello che state cercando si chiama“RainyDayTransposer-1 .0.0-debug.apk”. Potete copiarlo nel vostrodispositivo android usando il vostro filemanager preferito, e installarlo comequalsiasi altra applicazione dai vari appstores.

Questo è tutto quello che hopotuto scrivere questo mese.

./build.py --dir <path to your app>--name "<title>"--package <org.of.your.app>--version <human version>--icon <path to an icon to use>--orientation <landscape|portrait>--permission <android permission like VIBRATE> (multiple allowed)<debug|release> <installd|installr|...>