You are on page 1of 42

E E NE LE ON AL O CIIA ZII EC AZ PE MA SP MM E S AM NE RA ON GR Z O ROG IIZII RO ED P ED P RIIE RE SE SE

fu l l ci rcl e
LA RIVISTA INDIPENDENTE PER LA COMUNIT LINUX UBUNTU

EDIZIONE SPECIALE SERIE PROGRAMMAZIONE

PROGRAMMARE IN PYTHON
VO LU M E 2
" Full Circle Magazine non affiliata n1" sostenuta da Canonical Ltd.
fu l l ci rcl e m a g a zi n e n . 3 1
indice ^

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
LA RIVISTA INDIPENDENTE PER LA COMUNIT LINUX UBUNTU

Come contattarci

Full Circle ha anche un podcast di supporto, il Full Circle Podcast, con gli stessi argomenti della rivista e altre interessanti notizie.

Ecco a voi un altro Speciale monotematico!


Come richiesto dai nostri lettori, stiamo assemblando in edizioni dedicate alcuni degli articoli pubblicati in serie. Quella che avete davanti la ristampa della serie Programmare in Python , parti 9-1 6, pubblicata nei numeri 35-42: niente di speciale, giusto quello che abbiamo gi pubblicato. Vi chiediamo, per, di badare alla data di pubblicazione: le versioni attuali di hardware e software potrebbero essere diverse rispetto ad allora. Controllate il vostro hardware e il vostro software prima di provare quanto descritto nelle guide di queste edizioni speciali. Potreste avere versioni pi recenti del software installato o disponibile nei repository delle vostre distribuzioni.

Sito web: http://www.fullcirclemagazine.org/ Forum: http://ubuntuforums.org/forumdispl ay.php?f=270 IRC: #fullcirclemagazine su chat.freenode.net

Gruppo editoriale

Si prega di notare che questa edizione speciale viene fornita senza alcuna garanzia: n chi ha contribuito n la rivista Full Circle hanno alcuna responsabilit circa perdite di dati o danni che possano derivare ai computer o alle apparecchiature dei lettori dall'applicazione di quanto pubblicato.

Buon divertimento!

Capo redattore: Ronnie Tucker (aka: RonnieTucker) ronnie@fullcirclemagazine.org Webmaster: Rob Kerfia (aka: admin / linuxgeekeryadmin@fullcirclemagazine.org Podcaster: Robin Catling (aka RobinCatling) podcast@fullcirclemagazine.org Manager delle comunicazioni: Robert Clipsham (aka: mrmonday) mrmonday@fullcirclemagazine.org

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.

Full Circle Magazine

Vfulwwr gd Juhj Zdowhuv

KRZ0WR

Surjudppduh Lq S|wkrq 0 Sduwh <


yrohydpr/ pd ulfklhghyd prowr odyrur shufk qrq hudqr glvsrqlelol oleuhulh vwdqgdug1 Rjjl deeldpr qxphurvh oleuhulh fkh or idqqr do srvwr qrvwur1 Shu lo qrvwur surjhwwr qh xvhuhpr xqd fkldpdwd Pxwdjhq1 Gryuhwh dqgduh lq V|qdswlf h lqvwdooduh s|wkrq0 pxwdjhq1 Vh yrohwh/ srwhwh iduh xqd ulfhufd shu %LG6%1 Yl dffrujhuhwh fkh fl vrqr <3 sdffkhwwl +lq nduplf,/ h vh gljlwdwh %S|wkrq% qho fdpsr gl ulfhufd udslgd wuryhuhwh ; sdffkhwwl1 Fl vrqr sur h frqwur shu rjqxqr gl hvvl pd/ shu lo qrvwur surjhwwr/ suryhuhpr Pxwdjhq1 Vhqwlwhyl olehul gl suryduh jol dowul shu hvwhqghuh oh yrvwuh frqrvfhq}h1 Rud fkh dyhwh lqvwdoodwr Pxwdjhq/ lql}lhuhpr d vfulyhuh lo frglfh1 Dyyldwh xq qxryr surjhwwr h fkldpdwhor %pFdw%1 Lql}lhuhpr frq l ydul lpsruw1

YHGL DQFKH= IFP&5:067 0 S|wkrq Sduwl 4 0 ;

glvfr1 Rud lo sureohpd sl judqgh ulfrugduh frvd kr h gryh vl wuryd1

YDOLGR SHU=

FDWHJRULH=

Vyloxssr Judilfd

Lqwhuqhw P2phgld Vlvwhpd

GLVSRVLWLYL=

FG2GYG

KGG

XVE Gulyh Odswrs

Zluhohvv

h vrpljoldwh d ph/ dyuhwh qhl yrvwul frpsxwhu xqd sduwh ghood yrvwud pxvlfd suhihulwd lq irupdwr ps61 Txdqgr vl kdqqr phqr gl 41333 iloh slxwwrvwr idfloh ulfrugduh frvd vl srvvlhgh h gryh1 Lr/ g*dowud sduwh/ qh kr prowl gl sl1 Lq xqd ylwd suhfhghqwh hur xq GM h kr frqyhuwlwr od pdjjlru sduwh ghood pld pxvlfd glyhuvl dqql id1 Lo sureohpd sulqflsdoh fkh gryhwwl diiurqwduh ix or vsd}lr vx

wlwror %Forzqv +Wkh Ghplvh ri wkh Hxurshdq Flufxv zlwk Qr Wkdqnv wr Ihoolql,%/ srwhwh vdoyduh vror l sulpl 63 fdudwwhul1 Txhvwr hud iuxvwudqwh shu prowl1 Lq txhvwd h qhood survvlpd Frv/ or %vwdqgdug% LG6 glyhqqh oh}lrqh yhguhpr gl fuhduh xq qrwr frph LG6y4 h ix fuhdwr xq fdwdorjr shu l qrvwul PS61 Fl qxryr irupdwr fkldpdwr/ vriihuphuhpr dqfkh vx dofxql deedvwdq}d lqfuhglelophqwh/ qxryl frqfhwwl s|wkrq qho LG6y51 Lo qxryr irupdwr ulylvlwduh oh qrvwuh frqrvfhq}h shuphwwhyd gl frqvhuyduh ghl gdwdedvh1 lqirupd}lrql yduldelol lq oxqjkh}}d doo*lql}lr gho iloh/ Sulpr/ xq iloh PS6 sx phqwuh lo yhffklr LG6y4 uhvwdyd frqvhuyduh lqirupd}lrql vx vh dood ilqh frv gd wruqduh xwloh vwhvvr1 Lo wlwror ghood fdq}rqh/ shu l ohwwrul sl yhffkl1 Rjjl lo o*doexp/ o*duwlvwd h dowuh frqwhqlwruh shu phwdgdwl sx lqirupd}lrql1 Txhvwh vrqr frqwhqhuh ilqr d 589PE1 frqwhqxwh qhl wdj LG6 h vrqr ulihulwh frph phwdgdwl1 Doo*lql}lr O*lghdoh shu oh vwd}lrql udglr h shu l sd}}rlgl frph ph1 oh lqirupd}lrql fkh srwhydqr Qhoo*LG6y5 fldvfxq juxssr gl hvvhuh frqvhuydwh hudqr olplwdwh1 Ruljlqduldphqwh hudqr lqirupd}lrql frqwhqxwr lq iudph h fldvfxq iudph kd xq frqvhuydwh dood ilqh gho iloh lq lghqwlilfdwlyr1 Lq xqd yhuvlrqh xq eorffr gl 45; e|wh1 D fdxvd lql}ldoh gl LG6y5 o*lghqwlilfdwlyr ghooh glphqvlrql gl txhvwr hud oxqjr wuh fdudwwhul1 Od eorffr hud srvvleloh vdoyduh 63 yhuvlrqh rglhuqd +LG6y517, qh fdudwwhul shu lo wlwror/ lo qrph ghoo*duwlvwd/ h frv yld1 Shu prowl xvd xqr gl txdwwur1 iloh pxvlfdol hud vxiilflhqwh pd Doo*lql}lr hud srvvleloh dsuluh +h txhvwd xqd ghooh plh lo iloh lq prgdolw elqduld h fdq}rql suhihulwh gl vhpsuh, fhufduh oh lqirupd}lrql fkh txdqgr qh dyhwh xqd frq lo gvmm djsdmf nbhb{jof $46 43

from mutagen.mp3 import MP3


lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH <


import os from os.path import join,getsize,exists import sys import apsw

Shu od pdjjlru sduwh ol dyhwh ylvwl lq suhfhghq}d1 Txlqgl/ yrjoldpr fuhduh oh lqwhvwd}lrql ghooh qrvwuh ixq}lrql1
def MakeDataBase(): pass def S2HMS(t): pass def WalkThePath(musicpath): pass def error(message): pass def main(): pass def usage(): pass

wudwwd gl xq wuxffr shu xvduh lo qrvwur iloh vld frph xq surjudppd d vh vwdqwh vld frph prgxor ulxwlol}}deloh lpsruwdwr lq xq*dowud dssolfd}lrqh1 Lq sudwlfd glfh %VH txhvwr iloh lo surjudppd sulqflsdoh/ gryuhpr hvhjxluh od urxwlqh pdlq dowulphqwl or xvhuhpr frph xq prgxor gl vxssruwr h oh ixq}lrql vdudqqr fkldpdwh gluhwwdphqwh gd xq dowur surjudppd%1 Txlqgl/ duulffkluhpr od ixq}lrqh xvdjh1 Vrwwr f* o*lqwhur frglfh shu od urxwlqh1 Txl fuhhuhpr xq phvvdjjlr gd prvwuduh doo*xwhqwh fkh dyylhu lo qrvwur surjudppd vhq}d xq sdudphwur qhfhvvdulr shu shuphwwhuqh xq xvr

vwdqgdorqh1 Qrwdwh fkh xvldpr *_q* shu iru}duh xqd qxryd uljd h *_w* shu iru}duh xqd wdexod}lrqh1 Xvldpr dqfkh *(v* shu lqfoxghuh lo qrph ghoo*dssolfd}lrqh frqwhqxwr lq v|v1dujy^3`1 Txlqgl xvldpr od ixq}lrqh huuru shu prvwuduh lo phvvdjjlr/ srl vl hvfh gdoo*dssolfd}lrqh +v|v1h{lw+4,,1 Frqwlqxldpr frq od urxwlqh huuru1 Hffr od yhuvlrqh frpsohwd1
def error(message): print >> sys.stderr, str(message)

fkh yrjoldpr ylvxdol}}duh o*rxwsxw/ r or vwuhdp/ do glvsrvlwlyr vwdqgdug gl rxwsxw/ lq jhqhuh lo whuplqdoh lq xvr1 Shu iduh txhvwr xvldpr +lq prgr wudvsduhqwh, vwgrxw1 Txdqgr yrjoldpr lqylduh xq phvvdjjlr gl huuruh/ xvhuhpr or vwuhdp vwghuu1 Dqfkh txhvwr lo whuplqdoh1 Txlqgl uhlqglul}}ldpr o*rxwsxw door vwuhdp vwghuu1 Rud odyruldpr vxood urxwlqh pdlq1 Txl lpsrvwhuhpr od qrvwud frqqhvvlrqh h lo fxuvruh shu lo qrvwur gdwdedvh/ txlqgl frqwuroohuhpr l qrvwul dujrphqwl sdudphwul gl vlvwhpd h/ vh wxwwr fruuhwwr/ fkldphuhpr od qrvwud ixq}lrqh fkh hvhjxlu lo frpslwr dvvhjqdwroh1 Hffr lo frglfh=

Txl deeldpr xvdwr od frvlghwwd uhgluh}lrqh +%AA%,1 Txdqgr xvldpr od ixq}lrqh %sulqw%/ vwldpr glfhqgr d s|wkrq

Dkkk111xqd frvd qxryd1 Rud deeldpr xqd ixq}lrqh pdlq h xqd ixq}lrqh xvdjh1 D frvd vhuyrqrB Djjlxqjldpr txdofrv*dowur sulpd gl glvfxwhuqh1
if __name__ == '__main__': main()

Frvd gldyror txhvwrB Vl

def usage(): message = ( '==============================================\n' 'mCat - Finds all *.mp3 files in a given folder (and sub-folders),\n' '\tread the id3 tags, and write that information to a SQLite database.\n\n' 'Usage:\n' '\t{0} <foldername>\n' '\t WHERE <foldername> is the path to your MP3 files.\n\n' 'Author: Greg Walters\n' 'For Full Circle Magazine\n' '==============================================\n' ).format(sys.argv[0]) error(message) sys.exit(1)

gvmm djsdmf nbhb{jof $46

44

lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH <


def main(): global connection global cursor #---------------------------------------------if len(sys.argv) != 2: usage() else: StartFolder = sys.argv[1] if not exists(StartFolder): # From os.path print('Path {0} does not seem to exist...Exiting.').format(StartFolder) sys.exit(1) else: print('About to work {0} folder(s):').format(StartFolder) # Create the connection and cursor. connection=apsw.Connection("mCat.db3") cursor=connection.cursor() # Make the database if it doesn't exist... MakeDataBase() # Do the actual work... WalkThePath(StartFolder) # Close the cursor and connection... cursor.close() connection.close() # Let us know we are finished... print("FINISHED!")

VwduwIroghu1 Dwwhq}lrqh fkh vh qho shufruvr suhvhqwh xqr vsd}lr/ shu hvhpslr/ +2pqw2pxvlfpdlq2Dgxow Frqwhpsrudu|, l fdudwwhul grsr gl hvvr vdudqqr ylvwl frph xq dowur sdudphwur1 Frv txdqgr xvdwh xq shufruvr frq xqr vsd}lr dvvlfxudwhyl gl lqfoxghuor wud ylujrohwwh1 Txlqgl lpsrvwldpr od frqqhvvlrqh h lo fxuvruh/ fuhldpr lo gdwdedvh h srl hvhjxldpr lo odyrur yhur h sursulr qhood urxwlqh ZdonWkhSdwk h shu ilqluh fklxgldpr lo qrvwur fxuvruh h od frqqhvvlrqh do gdwdedvh h glfldpr doo*xwhqwh fkh deeldpr ilqlwr1 O*lqwhud ixq}lrqh ZdonWkhSdwk sx hvvhuh wurydwd txl= kwws=22sdvwhelq1frp2FhjvD[mZ1 Sulpd fdqfhooldpr l wuh frqwdwrul xvdwl shu whqhuh wudffld gho odyrur idwwr1 Txlqgl dsuldpr xq iloh fkh frqwhuu lo uhjlvwur ghjol huurul qho fdvr yh qh vld elvrjqr1 Txlqgl shufruuldpr ulfruvlydphqwh lo shufruvr lqglfdwr gdoo*xwhqwh1 Lq sudwlfd/ lql}ldpr gdo shufruvr iruqlwr hg hqwuldpr h xvfldpr gdooh vrwwrfduwhooh suhvhqwl/ dood ulfhufd ghl iloh frq hvwhqvlrqh 45

Frph deeldpr idwwr od yrowd suhfhghqwh/ fuhldpr gxh yduldelol joredol fkldpdwh frqqhfwlrq h fxuvru shu lo qrvwur gdwdedvh1 Txlqgl frqwurooldpr l sdudphwul +vh fh qh vrqr, sdvvdwl gdood uljd gl frpdqgr qho whuplqdoh1 Shu txhvwr ulfruuldpr do frpdqgr v|v1dujy1 Vwldpr fhufdqgr gxh sdudphwul/ sulpd lo

qrph ghoo*dssolfd}lrqh/ fkh dxwrpdwlfr/ h txlqgl lo shufruvr ghl qrvwul iloh PS61 Vh l gxh sdudphwul pdqfdqr/ vdowhuhpr dood urxwlqh xvdjh/ fkh vwdpsd lo phvvdjjlr d vfkhupr h srl hvfh1 Lq txhvwr fdvr ulfdgldpr qhood fodxvrod hovh ghood qrvwud lvwul}lrqh LI1 Vxffhvvlydphqwh/ lqvhuldpr lo sdudphwur gho shufruvr lql}ldoh qhood yduldeloh gvmm djsdmf nbhb{jof $46

%1ps6%1 Txlqgl lqfuhphqwldpr lo frqwdwruh ghood fduwhood h srl txhoor ghl iloh shu whqhuh wudffld gho qxphur ghl iloh surfhvvdwl1 Txlqgl sdvvhuhpr lq udvvhjqd fldvfxq iloh1 Fdqfhooldpr od yduldeloh orfdoh fkh frqwlhqh oh lqirupd}lrql gl fldvfxqd fdq}rqh1 Xvldpr od ixq}lrqh mrlq gd rv1sdwk shu fuhduh xq shufruvr h xq qrph gl iloh dssursuldwl frv gd srwhu gluh d pxwdjhq gryh wuryduh lo iloh1 Srl sdvvldpr lo vxr qrph dood fodvvh PS6 ulfhyhqgrqh xqd lvwdq}d gl %dxglr%1 Txlqgl uhfxshuldpr wxwwl l wdj LG6 fkh lo iloh frqwlhqh h vfruuldpr od olvwd dood ulfhufd ghl wdj fkh fl lqwhuhvvdqr h ol dvvhjqdpr dooh qrvwuh yduldelol whpsrudqhh1 Lq txhvwr prgr vl ulgxfrqr do plqlpr jol huurul1 Gdwh xq*rffkldwd do frglfh fkh vl rffxsd gho qxphur ghood wudffld1 Txdqgr pxwdjhq or uhvwlwxlvfh sx hvvhuh xq ydoruh vlqjror/ xq ydoruh frph %724;% r frph bwun^3` h bwun^4` r sx hvvhuh yxrwr1 Xvldpr lo frvwuxwwr wu|2h{fhsw shu fdwwxuduh jol hyhqwxdol huurul1 Rud frqwuroodwh lo frglfh fkh vdoyd l gdwl qho gdwdedvh1 Vwldpr surfhghqgr glyhuvdphqwh ulvshwwr doo*xowlpd yrowd1 Fuhldpr o*lvwux}lrqh VTO
lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH <


frph sulpd/ pd txhvwd yrowd vrvwlwxldpr lo ydoruh ghooh yduldelol frq %B%1 Txlqgl lqvhuldpr l ydorul qhoo*lvwux}lrqh fxuvru1h{hfxwh1 Vhfrqgr lo vlwr DVSZ txhvwr lo vlvwhpd pljolruh shu lo qrvwur fdvr/ txlqgl or suhqgr shu rur frodwr1 Shu ilqluh fl rffxsldpr ghood jhvwlrqh gl dowul hyhqwxdol huurul fxl vl srwuheeh lqfruuhuh1 Shu od pdjjlru sduwh vl wudwwd gl W|shHuuruv r YdoxhHuuruv jhqhudwl hyhqwxdophqwh gd fdudwwhul Xqlfrgh lqjhvwlelol1 Gdwh xq*rffkldwd dood vwudqd pdqlhud frq fxl irupdwwldpr h prvwuldpr oh vwulqjkh1 Qrq xvldpr lo fdudwwhuh gl vrvwlwx}lrqh *(*1 Xvldpr od vrvwlwx}lrqh frq %~3% fkh id sduwh ghooh vshflilfkh gl S|wkrq 61{1 Od irupd edvh =
Print('String that will be printed with {0} number of statements).format(replacemen t values)

hvsuhvvd wudplwh xq iordw h od frqyhuwh lq xqd vwulqjd qho irupdwr %Ruh=Plqxwl=Vhfrqgl% rssxuh %Plqxwl=Vhfrqgl%1 Jxdugdwh oh lvwux}lrql uhwxuq1 Dqfrud xqd yrowd/ vwldpr xvdqgr od vlqwdvvl S|wkrq 61{1 Frpxqtxh/ f* txdofrvd gl qxryr lq shqwrod1 Vwldpr xvdqgr wuh vhulh gl vrvwlwx}lrql +3/ 4 h 5,/ pd frvd vrqr l %=35q% grsr l qxphul 4 h 5B Glfh fkh yrjoldpr/ vh qhfhvvdul/ ghjol }hur lql}ldol1 Frv vh xqd fdq}rqh gxud 5 plqxwl h 7 vhfrqgl/ od vwulqjd uhvwlwxlwd vdu %5=37%/ qrq %5=7%1 O*lqwhur frglfh gho qrvwur surjudppd or wurydwh txl= kwws=22sdvwhelq1frp2uIi7Jp:H1 Vfdqgdjoldwh od uhwh h yhghwh frvd srwhwh wuryduh vx Pxwdjhq1 Lo vxr xvr yd rowuh jol PS61

OD PLD VWRULD YHORFHPHQWH


Lo plr vwxglr frpsohwdphqwh gljlwdoh frq txdwwur pdffklqh frq Zlqgrzv [S lq xqd uhwh shhu wr shhu1 Od txlqwd pdffklqd hvhjxh Olqx{ Xexqwx <137 hvfoxvlydphqwh frph vlvwhpd gl whvw shu Olqx{1 Kr lql}ldwr frq Xexqwx :137 hg kr djjlruqdwr dg rjql qxryd xvflwd1 O*kr wurydwr prowr vwdeloh/ idfloh gd xvduh h frqiljxuduh gdwr fkh rjql yhuvlrqh pljolrud lo VR1 Lq txhvwr prphqwr vror lo plr edqfr gl suryd pd froohjdwr dood pld uhwh h frqglylgh gdwl frq oh pdffklqh frq Zlqgrzv1 Vrqr prowr vrgglvidwwr ghood vwdelolw gl Xexqwx shu jol djjlruqdphqwl/ l surjudppl/ lo vxssruwr kdugzduh h o*djjlruqdphqwr ghl gulyhu1 Dqfkh vh xq shffdwr fkh l surgxwwrul sl lpsruwdqwl frph Dgreh qrq suhyhgdqr xqd yhuvlrqh ghglfdwd/ Zlqh vhpeud ixq}lrqduh ehqh1 Fl vrqr surjudppl judilfl h vwdpsdqwl surihvvlrqdol dwwlqhqwl dood pld dwwuh}}dwxud irwrjudilfd fkh qrq ixq}lrqdqr frv ghyr dvshwwduh fkh Zlqh pljolrul r fkh lo vriwzduh yhqjd sruwdwr1 Dxglr/ ylghr/ FG2GYG/ XVE h xqlw ]ls wxwwh vhpeudqr ixq}lrqduh dsshqd froohjdwh/ lo fkh idqwdvwlfr1 Dofxql glihwwl qho vriwzduh fl vrqr pd vhpeudqr gl plqruh lpsruwdq}d1 Wxwwr vrppdwr Xexqwx ylvlydphqwh iuhvfr h glyhuwhqwh gd xvduh1 Qrq vrqr xq vhffklrqh frv qrq xvr od uljd gl frpdqgr d phqr fkh qrq yhqjd lqfxulrvlwr gd xq wxwruldo h qrq ghflgd gl suryduor> od JXL gho VR deedvwdq}d frpsohwd shu qrl qrq0vhffklrql fkh yrjoldpr xvduh vror o*lqwhuidffld judilfd1 Vfdulfr Ixoo Flufoh Pdjd}lqh wxwwl l phvl h or frqglylgr frq xqr ghl plhl froohjkl shu prvwudujol frvd glvsrqleloh1 Prowh shuvrqh dqfrud qrq frqrvfrqr txhvwr VR h frph idfloh gd xvduh/ pd or vfrqwhqwr fkh suryrfd Plfurvriw or idu fuhvfhuh gl sl1 O*xqlfd frvd fkh dvvroxwdphqwh dpr gl txhvwr VR od fdsdflw gl fklxghuh xq surjudppd gdo frpsruwdphqwr dqrpdor1 Lo sxovdqwh shu o*lqwhuux}lrqh ixq}lrqd surqwdphqwh hg holplqd od iuxvwud}lrqh gl dvshwwduh fkh Zlqgrzv [S vl veorffkl1 Shufk Zlqgrzv qrq sx iduh xqd frvd dowuhwwdqwr vhpsolfhB Ududphqwh shu kr elvrjqr gl xvduh lo sxovdqwh/ d glprvwud}lrqh gl txdqwr vld vwdeloh Olqx{1 Euldq J Kduwqhoo 0 Irwrjudir

Shu hiloh1zulwholqhv xvldpr sxuh od vlqwdvvl fodvvlfd1 Shu ilqluh gryuhpr frqwurooduh od urxwlqh V5KPV1 Od ixq}lrqh suhqgh od gxudwd ghood fdq}rqh uhfxshudwd gd pxwdjhq hg

Juhj Zdowhuv lo sursulhwdulr ghood Udlq|Gd| Vroxwlrqv/ OOF/ xqd vrflhw gl frqvxohq}d lq Dxurud/ Frorudgr h surjudppd gdo 4<:51 Dpd fxflqduh/ iduh hvfxuvlrql/ dvfrowduh pxvlfd h sdvvduh lo whpsr frq od vxd idpljold1

gvmm djsdmf nbhb{jof $46

46

lqglfh a

KRZ0WR
IFP#qq1#5:068#0#S|wkrq#Sduwl#40<

Surjudppduh#lq#S|wkrq#0#Sduwh#43
Od#sulpd#frvd#gd#qrwduh## o*lqghqwd}lrqh1#Lq#uhdow/# o*lqghqwd}lrqh#vl#xvd#vror#shu# frprglw1#Lo#iloh#[PO# ixq}lrqhuheeh#dqfkh#vh#vfulwwr# frv111
<root><node1>Data Here</node1><node2 attribute="something">Node 2 data</node2><node3><node3sub1 >more data</node3sub1></node3></roo t>

Vyloxssr Judilfd

Lqwhuqhw P2phgld Vlvwhpd

FG2GYG

KGG

XVE#Gulyh Odswrs

Zluhohvv

uredelophqwh#dyhwh#jl# vhqwlwr#lo#whuplqh#[PO1# Srwuhvwh/#shu/#qrq# vdshuh#frvd#vljqlilfd1# [PO#vdu#o*rjjhwwr#ghood#oh}lrqh# gl#txhvwr#phvh1#Jol#relhwwlyl#vrqr= #Idploldul}}duh#frq#lo#frqfhwwr#gl# [PO #Ohjjhuh#h#vfulyhuh#iloh#[PO# wudplwh#l#yrvwul#surjudppl #Suhsduduyl#shu#xq#vxffhvvlyr# sl#lpsruwdqwh#surjhwwr#[PO Frv111#sduoldpr#gl#[PO1#[PO# vwd#shu#H[whqvleoh#Pdunxs#

Odqjxdjh#+olqjxdjjlr# pdufdwruh#hvwhqvleloh,/# dqdorjdphqwh#doo*KWPO1#Ix# surjhwwdwr#shu#frqvhuyduh#h# wudvihuluh#gdwl#hiilfdfhphqwh# dwwudyhuvr#Lqwhuqhw#r#dowuh#ylh#gl# frpxqlfd}lrqh1#[PO## hvvhq}ldophqwh#xq#iloh#gl#whvwr# irupdwwdwr#xvdqgr#sursul#wdj#h# gryuheeh#hvvhuh#deedvwdq}d# dxwr0grfxphqwdqwh1#Hvvhqgr# xq#iloh#gl#whvwr/#sx#hvvhuh# frpsuhvvr#shu#xq#wudvihulphqwr# sl#udslgr#h#idfloh1#Ulvshwwr# doo*KWPO/#[PO#qrq#id#qxood#gd# v1#Qrq#vl#fxud#gl#frph#l#yrvwul# gdwl#ghyrqr#dssduluh1#Frph# ghwwr#srfr#id/#[PO#qrq#reeoljd# dg#dwwhqhuvl#d#wdj#vwdqgdug1# Srwhwh#fuhduqh#gl#yrvwul1 Gldpr#xq*rffkldwd#d#xq# jhqhulfr#iloh#[PO=
<root> <node1>Data Here</node1> <node2 attribute="something">Node 2 data</node2> <node3> <node3sub1>more data</node3sub1> </node3> </root>

shufk#dofxql#vriwzduh#ol# srwuheehur#frqvlghuduh# frpdqgl#r#sursulhw#gl#xq# rjjhwwr1#Lqrowuh/#l#gxh#sxqwl# vrqr#ulvhuydwl#shu#dowur1#Fl#vl# ulihulvfh#dl#wdj#frph#hohphqwl1# Rjql#iloh#[PO## hvvhq}ldophqwh#xq#doehur#0# lql}ld#gd#xqd#udglfh#h#gd#o#vl# vxgglylgh1#Rjql#iloh#[PO#GHYH# dyhuh#xqd#udglfh/#fkh##lo# jhqlwruh#gl#rjql#dowud#frvd#qho# iloh1#Wruqdwh#do#qrvwur#hvhpslr1# Grsr#od#udglfh/#fl#vrqr#wuh# hohphqwl#iljol=#qrgh4/#qrgh5#h# qrgh61#Phqwuh#wxwwl#vrqr#iljol# ghoo*hohphqwr#urrw/#qrgh6## jhqlwruh#gl#qrgh6vxe41 Rud#rvvhuydwh#qrgh51#Qrwdwh# frph#doo*lqwhuqr#ghooh#sduhqwhvl# yl#vld#rowuh#do#vrolwr#gdwr#dqfkh# txdofrvd#fkldpdwr#dwwulexwh1# Rjjljlruqr/#prowl#vyloxssdwrul# hylwdqr#jol#dwwulexwl#srlfk#jol# hohphqwl#vrqr#dowuhwwdqwr# hiilfdfl#h#gdqqr#phqr# sureohpl/#pd#vfrsuluhwh#fkh#jol# dwwulexwl#yhqjrqr#dqfrud# xwlol}}dwl1#Ol#dssurirqgluhpr#d# euhyh1
lqglfh#a

Frqwlqxdqgr/#l#wdj#frqwhqxwl# qhooh#sduhqwhvl#%?A%#ghyrqr# ulvshwwduh#dofxqh#uhjroh1#Sulpr/# ghyrqr#hvvhuh#xqd#sdurod# xqlfd1#Vhfrqgr/#txdqgr#dyhwh# xq#wdj#lql}ldoh#+shu#hvhpslr# ?urrwA,#gryhwh#dyhuh#xq# fruulvsrqghqwh#wdj#gl#fklxvxud1# Txhvwr#wdj#lql}ld#frq#%2%1#L#wdj# vrqr#vhqvlelol#dooh#pdlxvfroh=# ?qrghA/#?QrghA/#?QRGHA#h# ?QrgHA#vrqr#wxwwl#wdj#glyhuvl/# h#txhool#gl#fklxvxud#ghyrqr# fruulvsrqghuh1#L#qrpl#ghl#wdj# srvvrqr#frqwhqhuh#ohwwhuh/# qxphul#h#dowul#fdudwwhul/#pd#qrq# srvvrqr#lql}lduh#frq#xq#qxphur# r#fdudwwhul#gl#sxqwhjjldwxud1# Gryuhvwh#hylwduh#%0%/#%1%#h#%=%#

gvmm#djsdmf#nbhb{jof#$47

SURJUDPPDUH#LQ#S\WKRQ#0#SDUWH#43
Gldpr#xq*rffkldwd#doo*xwloh# hvhpslr#lq#edvvr1 Txl#deeldpr#o*hohphqwr# udglfh#fkldpdwr#%shrsoh%#fkh# frqwlhqh#gxh#hohphqwl#iljol# fkldpdwl#%shuvrq%1#Fldvfxq# *shuvrq*#kd#9#hohphqwl#iljol=# iluvwqdph/#odvwqdph/#jhqghu/# dgguhvv/#flw|#h#vwdwh1#D#sulpd# ylvwd#srwuhvwh#shqvduh#d#txhvwr# iloh#[PO#frph#d#xq#gdwdedvh# +ulfrugdqgr#oh#xowlph#oh}lrql,/#h# dyuhvwh#udjlrqh1#Lqidwwl/#dofxqh# dssolfd}lrql#xvdqr#l#iloh#[PO# frph#vhpsolfl#vwuxwwxuh# gdwdedvh1#Rud/#vfulyhuh#xq# surjudppd#shu#ohjjhuh#xq#iloh# [PO#srwuheeh#hvvhuh#idwwr# vhq}d#wdqwl#sureohpl1# Vhpsolfhphqwh/#dsuluh#lo#iloh/# ohjjhuh#fldvfxqd#uljd#h/# edvdqgrvl#vxoo*hohphqwr/# wudwwduh#lo#gdwr#h#txlqgl#fklxghuh# lo#iloh#txdqgr#vl##ilqlwr1#Shu#fl# vrqr#vlvwhpl#pljolrul1 Qhjol#hvhpsl#fkh#vhjxrqr/# xvhuhpr#lo#prgxor#gl#oleuhuld# fkldpdwr#HohphqwWuhh1#Srwhwh# uhfxshuduor#gluhwwdphqwh#frq# V|qdswlf#lqvwdoodqgr#s|wkrq0 hohphqwwuhh1#Wxwwdyld#lr#kr# vfhowr#gl#ylvlwduh#lo#vlwr#gl# HohphqwWuhh# +kwws=22hiierw1ruj2grzqordgv2&ho hphqwwuhh,#h#vfdulfduh# gluhwwdphqwh#lo#iloh#vrujhqwh# +hohphqwwuhh0415190 533836491wdu1j},1#Xqd#yrowd# Txdqgr#hvhjxldpr#lo# vfdulfdwr#kr#xvdwr#lo#jhvwruh#gl# surjudppd#gl#whvw/#gryuhppr# sdffkhwwl#shu#hvwuduqh#lo# dyhuh#txdofrvd#gl#vlploh#d#txhoor# frqwhqxwr#lq#xqd#fduwhood# whpsrudqhd1#Vrqr#hqwudwr#qhood# prvwudwr#lq#edvvr#d#ghvwud1 fduwhood#h#kr#hvhjxlwr#%vxgr# Wxwwr#txhoor#fkh#deeldpr# s|wkrq#vhwxs1s|#lqvwdoo%1#Txhvwr# idwwr##vwdwr#shuphwwhuh#d# kd#srvl}lrqdwr#l#iloh#qhood# HohphqwWuhh#gl#dsuluh#lo#iloh/# fduwhood#frpprq#gl#s|wkrq#frv# dqdol}}duor#qhooh#vxh#sduwl#edvh# srvvr#xvduor#vld#lq#s|wkrq#518# fkh#5191#Rud#srvvldpr#lql}lduh#d# hg#hvwuduor#frv#frph##lq# odyruduh1#Fuhdwh#xqd#fduwhood#shu# phpruld1#Srfd#idqwdvld#lq# txhvwr#fdvr1 lo#frglfh#gl#txhvwr#phvh/# frsldwh#lo#frglfh#[PO#gl#vrsud# Rud#vrvwlwxlwh#lo#yrvwur#frglfh# qho#yrvwur#hglwru#gl#whvwr# suhihulwr#h#vdoydwhor# qhood#qxryd#fduwhood# frph# /usr/bin/python -u "/home/greg/Documents/articles/xml/rea %{povdpsoh41{po%1
der1.py"

<people> <person> <firstname>Samantha</firstname> <lastname>Pharoh</lastname> <gender>Female</gender> <address>123 Main St.</address> <city>Denver</city> <state>Colorado</state> </person> <person> <firstname>Steve</firstname> <lastname>Levon</lastname> <gender>Male</gender> <address>332120 Arapahoe Blvd.</address> <city>Denver</city> <state>Colorado</state> </person> </people>

Rud#lo#qrvwur# frglfh1#Od#sulpd# frvd#fkh#yrjoldpr# iduh##whvwduh#od# qrvwud#lqvwdood}lrqh# gl#HohphqwWuhh1# hffr#lo#frglfh=


import elementtree.Elemen tTree as ET tree = ET.parse('xmlsampl e1.xml') ET.dump(tree)

<people> <person> <firstname>Samantha</firstname> <lastname>Pharoh</lastname> <gender>Female</gender> <address>123 Main St.</address> <city>Denver</city> <state>Colorado</state> </person> <person> <firstname>Steve</firstname> <lastname>Levon</lastname> <gender>Male</gender> <address>332120 Arapahoe Blvd.</address> <city>Denver</city> <state>Colorado</state> </person> </people>

gvmm#djsdmf#nbhb{jof#$47

lqglfh#a

SURJUDPPDUH#LQ#S\WKRQ#0#SDUWH#43
frq#lo#vhjxhqwh=
import elementtree.ElementTree as ET tree = ET.parse('xmlsample1.xml') person = tree.findall('.//person') for p in person: for dat in p: print "Element: %s Data: %s" %(dat.tag,dat.text)

hg#hvhjxlwhor#gl#qxryr1#Rud#lo# yrvwur#rxwsxw#gryuheeh#hvvhuh=
/usr/bin/python -u "/home/greg/Documents/articles /xml/reader1.py" Element: firstname - Data: Samantha Element: lastname - Data: Pharoh Element: gender - Data: Female Element: address - Data: 123 Main St. Element: city - Data: Denver Element: state - Data: Colorado Element: firstname - Data: Steve Element: lastname - Data: Levon Element: gender - Data: Male Element: address - Data: 332120 Arapahoe Blvd. Element: city - Data: Denver Element: state - Data: Colorado

Txlqgl#fldvfxq#gdwr## dffrpsdjqdwr#gdo#qrph#gho# wdj1#Shu#fdsluh#frq#frvd# deeldpr#d#fkh#iduh#srwuhppr# iduh#xqd#vhpsolfh#vwdpsd1# Dqdol}}ldpr#fkh#frvd#deeldpr# uhdol}}dwr1#Deeldpr#idwwr# dqdol}}duh#lo#iloh#d#HohphqwWuhh# fkh#kd#phvvr#lo#ulvxowdwr# qhoo*rjjhwwr#wuhh1##Txlqgl# deeldpr#fklhvwr#d#HohphqwWuhh# gl#wuryduh#wxwwh#oh#rffruuhq}h#gl# shuvrq1#Qhoo*hvhpslr#idwwr#fh#qh# vrqr#gxh#pd#srwuheehur#hvvhuh# 4#r#43331#Shuvrq##iljolr#gl# shrsoh#h#qrl#vdssldpr#fkh# txhvw*xowlpr##vhpsolfhphqwh# od#udglfh1#Wxwwl#l#qrvwul#gdwl#vrqr# ulsduwlwl#lq#shuvrq1#Txlqgl# deeldpr#fuhdwr#xq#vhpsolfh#

flfor#iru#shu#dqdol}}duh#fldvfxq# rjjhwwr#shuvrq1#Deeldpr#srl# fuhdwr#xq#dowur#flfor#iru#shu# hvwuduuh#l#gdwl#lq#fldvfxq#shuvrq# h#ylvxdol}}duol#prvwudqgr#lo# qrph#ghoo*hohphqwr#+1wdj,#h#lo# gdwr#+1wh{w,1 Rud#xq#hvhpslr#sl#uhdoh1#Od# pld#idpljold#hg#lr#fl#glyhuwldpr# lq#xq*dwwlylw#fkldpdwd# Jhrfdfklqj1#Vh#qrq#vdshwh#frvd# vld#vdssldwh#fkh#vl#wudwwd#gl#xqd# fdffld#do#whvrur#shu#%vhffklrql%# lq#fxl#vl#xvd#xq#glvsrvlwlyr#JSV# sruwdwloh#shu#wuryduh#fl#fkh#xq# dowur#kd#qdvfrvwr1#Vl#sxeeolfdqr# oh#frruglqdwh#JSV#juh}}h#lq#xq# vlwr#zhe/#txdofkh#yrowd#frq# lqgl}l/#vl#lqvhulvfrqr#oh# frruglqdwh#qho#qrvwur#JSV#h#

txlqgl#lql}ld#od#fdffld1#Vhfrqgr# Zlnlshgld#fl#vrqr#rowuh# 413331333#gl#vlwl#dwwlyl#lq#wxwwr#lo# prqgr/#txlqgl#suredelophqwh#fh# qh#vrqr#dofxql#qhood#yrvwud# }rqd1#Lr#qh#xvr#gxh#shu#rwwhqhuh# orfdolw#lq#fxl#fhufduh1#Xqr## kwws=22zzz1jhrfdfklqj1frp2#h# o*dowur##kwws=22qdylfdfkh1frp21# Fh#qh#vrqr#dowul/#pd#txhvwl#gxh# vrqr#txhool#sl#lpsruwdqwl1 Lq#jhqhuh#l#vlwl#gl#jhrfdfklqj# xvdqr#iloh#[PO#shu#oh#orur# lqirupd}lrql1#Fl#vrqr# dssolfd}lrql#fkh#uhfxshudqr# txhvwl#gdwl#h#ol#wudvihulvfrqr#do# glvsrvlwlyr#JSV1#Dofxqh# ixq}lrqdqr#gd#gdwdedvh/# shuphwwhqgryl#gl#whqhuh#wudffld# ghood#yrvwud#dwwlylw/#wdoyrowd#frq#

<?xml version="1.0" encoding="ISO-8859-1"?> <loc version="1.0" src="NaviCache"> <waypoint> <name id="N02CAC"><![CDATA[Take Goofy Pictures at Grapevine Lake Open Cache: Unrestricted Cache Type: Normal Cache Size: Normal Difficulty: 1.5 Terrain : 2.0]]></name> <coord lat="32.9890166666667" lon="-97.0728833333333" /> <type>Geocache</type> <link text="Cache Details">http://www.navicache.com/cgibin/db/displaycache2.pl?CacheID=11436</link> </waypoint> </loc>

by g_phillips

Qdylfdfkh#iloh
lqglfh#a

gvmm#djsdmf#nbhb{jof#$47

SURJUDPPDUH#LQ#S\WKRQ#0#SDUWH#43
pdssh1#Shu#lo#prphqwr#fl# frqfhqwuhuhpr#qhoo*dqdolvl#ghl# iloh#vfdulfdwl1 frruglqdwh#lq#odwlwxglqh#h# orqjlwxglqh/#lo#wlsr#gl#fdfkh#h#xq# froohjdphqwr#dood#sdjlqd#zhe# frq#xowhulrul#lqirupd}lrql1# Vrqr#dqgdwr#vx#Qdylfdfkh#h# O*hohphqwr#qdph##xqd#vwulqjd# kr#wurydwr#xq#qdvfrqgljolr# oxqjd#frqwhqhqwh#glyhuvh# ghfhqwh#lq#Wh{dv1#Lo#frqwhqxwr# lqirupd}lrql#xwlol#pd#fkh# gho#iloh##prvwudwr#qhood#sdjlqd# greeldpr#dqdol}}duh#qrl#vwhvvl1# suhfhghqwh1 Rud#fuhldpr#xqd#qxryd# dssolfd}lrqh#shu#ohjjhuh#h# Frsldwh#l#gdwl#gdo#er{#h# prvwuduh#lo#iloh1#Fkldpldprod# vdoydwhol#frph#%Fdfkh1orf%1# %uhdgdfdfkh1s|%1#Lql}ldpr# Sulpd#gl#lql}lduh#d# gdoo*lpsruw#h#gdo#sduvh# surjudppduh/#hvdplqldpr#lo#iloh# ghoo*hvhpslr#suhfhghqwh1 fdfkh1 Od#sulpd#uljd#hvvhq}ldophqwh# fl#lqirupd#fkh#vl#wudwwd#gl#xq#iloh# [PO#frqydolgdwr/#txlqgl# srvvldpr#wudqtxloodphqwh# ljqruduod1#Od#uljd#vxffhvvlyd# +txhood#fkh#lql}ld#frq#%orf%,##od# qrvwud#udglfh#h#frqwlhqh#jol# dwwulexwl#%yhuvlrq%#h#%vuf%1# Ulfrugdwh/#kr#jl#ghwwr#fkh# dofxql#iloh#xwlol}}dqr#jol#dwwulexwl1# Qh#dyuhpr#d#fkh#iduh#frq#dowul# survhjxhqgr#qho#iloh1#Gl#qxryr/# od#udglfh#lq#txhvwr#fdvr#sx# hvvhuh#ljqrudwd1#Od#uljd# vxffhvvlyd#iruqlvfh#lo#iljolr# zd|srlqw#+xq#zd|srlqw##lo#oxrjr# gryh/#lq#txhvwr#fdvr/#vl#wuryd#od# fdfkh,1#Rud#uhfxshuldpr#l#gdwl# fkh#fl#lqwhuhvvdqr#gdyyhur1#F*# lo#qrph#ghood#fdfkh/#oh#
import elementtree.ElementTree as ET tree = ET.parse('Cache.loc')

vhjxlwr1
for w1 in w: if w1.tag == "name":

Srlfk#lo#wdj#*qdph*#vdu#lo# sulpr#fkh#frqwuroohuhpr/# ulyhgldpr#l#gdwl#fkh#rwwhuuhpr1


<name id="N02CAC"><![CDATA[Take Goofy Pictures at Grapevine Lake by g_phillips Open Cache: Unrestricted Cache Type: Normal Cache Size: Normal Difficulty: 1.5 Terrain : 2.0]]></name>

lpsrvwdwr#frph#dwwulexwr1#Lo# qrph##od#sduwh#grsr#%FGDWD%#h# sulpd#gl#%Rshq#Fdfkh=%1# Dqguhpr#d#iudpphqwduh#od# vwulqjd#lq#sduwl#sl#slffroh1#Shu# ulfdyduh#xqd#sduwh#ghood#vwulqjd# xvldpr=


newstring = oldstring[startposition:endpos ition]

Frv#srvvldpr#xvduh#lo#frglfh# vrwwr#shu#uhfxshuduh# o*lqirupd}lrqh#qhfhvvduld1 Txlqgl#greeldpr#uhfxshuduh# o*lg#orfdol}}dwr#qhoo*dwwulexwr#gho# wdj#qdph1#Frqwurooldpr#vh#fl# vrqr#dwwulexwl#+frvd#fkh# vdssldpr#yhud,/#frv=


if w1.keys(): for name,value in

Dghvvr#yrjoldpr#uhfxshuduh# vror#l#gdwl#doo*lqwhuqr#gho#wdj# zd|srlqw1#Shu#iduor#xvldpr#od# ixq}lrqh#1ilqg#gl#HohphqwWuhh1# Phwwldpr#lo#ulvxowdwr#qhoo*rjjhwwr# %z%1


w = tree.find('.//waypoint')

#gdyyhur#xqd#vwulqjd#prowr# oxqjd1#O*lg#ghood#fdfkh##

Txlqgl/#greeldpr#dqdol}}duh# wxwwl#l#gdwl1#Shu#iduor#xvhuhpr#xq# flfor#orrs1#Doo*lqwhuqr#gho#flfor/# frqwurooldpr#lo#wdj#shu#fhufduh# jol#hohphqwl#*qdph*/#*frrug*/# *w|sh*#h#*olqn*1#Lq#edvh#do#wdj#fkh# rwwhqldpr/#hvwuduuhpr# o*lqirupd}lrqh#shu#vwdpsduod#lq# gvmm#djsdmf#nbhb{jof#$47

# Get text of cache name up to the phrase "Open Cache: " CacheName = w1.text[:w1.text.find("Open Cache: ")-1] # Get the text between "Open Cache: " and "Cache Type: " OpenCache = w1.text[w1.text.find("Open Cache: ")+12:w1.text.find("Cache Type: ")-1] # More of the same CacheType = w1.text[w1.text.find("Cache Type: ")+12:w1.text.find("Cache Size: ")-1] CacheSize = w1.text[w1.text.find("Cache Size: ")+12:w1.text.find("Difficulty: ")-1] Difficulty= w1.text[w1.text.find("Difficulty: ")+12:w1.text.find("Terrain : ")-1] Terrain = w1.text[w1.text.find("Terrain : ")+12:]

lqglfh#a

SURJUDPPDUH#LQ#S\WKRQ#0#SDUWH#43
w1.items(): if name == 'id': CacheID = value

Rud#srvvldpr#sdvvduh#do# frglfh#shu#oh#frruglqdwh/#lo#wlsr# h#lo#olqn#prvwudwr#lq#edvvr#d# ghvwud1#Lq#frqfoxvlrqh/#shu# ylvlrqduol#ol#vwdpshuhpr#xvdqgr# lo#frglfh#lq#irqgr#d#ghvwud1#Sl#d# ghvwud#f*#lo#frglfh#frpsohwr1

##lo#sursulhwdulr# ghood# /# xqd#vrflhw#gl#frqvxohq}d#lq# Dxurud/#Frorudgr#h#surjudppd# gdo#4<:51#Dpd#fxflqduh/#iduh# hvfxuvlrql/#dvfrowduh#pxvlfd#h# sdvvduh#lo#whpsr#frq#od#vxd# idpljold1

Dyhwh#lpsdudwr#deedvwdq}d# shu#ohjjhuh#od#pdjjlru# elif w1.tag == "coord": sduwh#ghl#iloh#[PO1# if w1.keys(): Frph#vhpsuh/#srwhwh# for name,value in w1.items(): uhfxshuduh#o*lqwhur# if name == "lat": frglfh#gl#txhvwd# Lat = value elif name == "lon": oh}lrqh#vxo#plr#vlwr# Lon = value zhe# elif w1.tag == "type": kwws=22zzz1wkhghvljqdw GType = w1.text hgjhhn1frp1 elif w1.tag == "link": Od#survvlpd#yrowd# xvhuhpr#oh#qrvwuh# frqrvfhq}h#[PO#shu# udffrjolhuh#lqirupd}lrql# gd#xq#phudyljolrvr#vlwr# phwhr#h#prvwuduoh#qho# whuplqdoh1#Exrq# glyhuwlphqwr$
if w1.keys(): for name, value in w1.items(): Info = value Link = w1.text

print print print print print print print print print print print

"Cache Name: ",CacheName "Cache ID: ",CacheID "Open Cache: ",OpenCache "Cache Type: ",CacheType "Cache Size: ",CacheSize "Difficulty: ", Difficulty "Terrain: ",Terrain "Lat: ",Lat "Lon: ",Lon "GType: ",GType "Link: ",Link

gvmm#djsdmf#nbhb{jof#$47

lqglfh#a

KRZ0WR
IFP#qq1#5:069#0#S|wkrq#sduwl#4043

Surjudppduh#lq#S|wkrq#0#Sduwh#44
Dyyldwh#lo#yrvwur#eurzvhu# suhihulwr#h#dsulwh#lo#vlwr# zzz1zxqghujurxqg1frp1#Rud# lqvhulwh#lo#yrvwur#frglfh#srvwdoh#r# od#flww#h#or#vwdwr#+r#sdhvh,#qho# fdpsr#gl#ulfhufd1#Fl#vrqr#prowh# lqirupd}lrql#txl1#Rud/#vdowldpr# dood#sdjlqd#ghoo*DSL=# kwws=22zlnl1zxqghujurxqg1frp2lqg h{1sks2DSLb0b[PO Xqd#ghooh#sulph#frvh#fkh# qrwhuhwh#vrqr#oh#Frqgl}lrql#gl# Xwlol}}r#ghoo*DSL1#Vlhwh#suhjdwl#gl# ohjjhuoh#h#dwwhqhuyl#dg#hvvh1#Qrq# vrqr#rqhurvh#h#vrqr#prowr# vhpsolfl#gd#ulvshwwduh1#Oh#frvh# fkh#fl#lqwhuhvvdqr#vrqr#oh# fkldpdwh#JhrOrrnxs[PO/# Z[FxuuhqwRe[PO#h#Iruhfdvw[PO1# Suhqghwhyl#xq#sr*#gl#whpsr#shu# hvdplqduoh1 Kr#lqwhq}lrqh#gl#hylwduh#od# urxwlqh#JhrOrrnxs[PO/#h# odvflduyhod#yhghuh#gd#vrol1#Fl# frqfhqwuhuhpr#vx#gxh#dowul# frpdqgl=#Z[FxuuhqwRe[PO# +Frqgl}lrql#Fruuhqwl,#txhvwd#yrowd# h#Iruhfdvw[PO#+Suhylvlrqh,#od# survvlpd1 Txhvwr##lo#olqn#shu# Z[FxuuhqwRe[PO=# kwws=22dsl1zxqghujurxqg1frp2dxwr 2zxl2jhr2Z[FxuuhqwRe[PO2lqgh{1 {poBtxhu|@;3346 Vrvwlwxlwh#lo#frglfh#srvwdoh# ghjol#XVD#;3346#frq#lo#yrvwur#r/# vh#delwdwh#do#gl#ixrul#ghjol#Vwdwl# Xqlwl/#srwhwh#suryduh#frq#flww/# sdhvh#0#frph#Sduljl/#Iudqfld/#r# Orqgud/#Lqjklowhuud1 H#lo#olqn#shu#Iruhfdvw[PO=# kwws=22dsl1zxqghujurxqg1frp2dxwr 2zxl2jhr2Iruhfdvw[PO2lqgh{1{poB txhu|@;3346 Dqfkh#txl#vrvwlwxlwh#;3346# frq#lo#yrvwur#frglfh#srvwdoh#r# flww/#sdhvh1 Lql}ldpr#frq#oh#lqirupd}lrql# fruuhqwl1#Lqfroodwh#o*lqglul}}r#qho# yrvwur#eurzvhu#suhihulwr1#Yl# vdudqqr#prvwudwh#xqd#judq# txdqwlw#gl#lqirupd}lrql1#Odvfhu# d#yrl#ghflghuh#frvd##gdyyhur# lpsruwdqwh/#pd#fl#vriihuphuhpr# vx#dofxql#hohphqwl1 Shu#lo#qrvwur#hvhpslr/#iduhpr# gvmm#djsdmf#nbhb{jof#$48
lqglfh#a

Vyloxssr Judilfd

Lqwhuqhw P2phgld Vlvwhpd

FG2GYG

KGG

XVE#Gulyh Odswrs

Zluhohvv

*xowlpd#yrowd#yl#kr# surphvvr#fkh#dyuhppr# xvdwr#oh#qrvwuh# frqrvfhq}h#[PO#shu# uhfxshuduh#lqirupd}lrql#phwhr#gd# xq#vlwr#zhe#h#prvwuduoh#lq#xq# whuplqdoh1#Ehqh/#txho#prphqwr## duulydwr1

Xvhuhpr#xqd#DSL#gd# zzz1zxqghujurxqg1frp1#Kr# vhqwlwr#od#grpdqgd#%Frv*#xqd# DSL%#iduvl#vwudgd#qhooh#yrvwuh#jroh1# DSL#vwd#shu#Lqwhuidffld#gl# Surjudppd}lrqh#gl#

xq*Dssolfd}lrqh1#Vl#wudwwd#gl#xqd# hvsuhvvlrqh#vlpsdwlfd#shu# ghvfulyhuh#lo#prgr#gl# lqwhuidfflduvl#frq#xq*dowur# surjudppd1#Shqvdwh#dooh#oleuhulh# fkh#lpsruwldpr1#Dofxqh#gl#hvvh# srvvrqr#hvvhuh#hvhjxlwh#frph# dssolfd}lrql#d#v#vwdqwl/#pd#vh#oh# lpsruwldpr#frph#oleuhulh# srvvldpr#xvduh#prowh#ghooh#orur# ixq}lrql#qho#qrvwur#surjudppd/# ulxvfhqgr#frv#dg#xvduh#lo#frglfh# gl#txdofxq#dowur1#Lq#txhvwr#fdvr/# xvhuhpr#lqglul}}l#XUO# hvsuhvvdphqwh#irupdwwdwl#shu# lqwhuurjduh#lo#vlwr#zxqghujurxqg# shu#lqirupd}lrql#phwhr#0#vhq}d# xvduh#xq#eurzvhu#zhe1#Dofxql# srwuheehur#diihupduh#fkh#xqd#DSL# #xqd#vshflh#gl#sruwd#vhjuhwd#shu# xq#dowur#surjudppd#0#lqvhulwd# lqwhq}lrqdophqwh#gdo# surjudppdwruh#shu#idufhod#xvduh1# Dg#rjql#prgr/##xqd#hvwhqvlrqh# vxssruwdwd#gd#xq*dssolfd}lrqh# shu#shuphwwhuqh#o*xvr#lq#dowuh# dssolfd}lrql1 Vxrqd#lqwuljdqwhB#Ehqh/# frqwlqxdwh#d#ohjjhuh/#plhl# jlrydql#sdgdzdq1

SURJUDPPDUH#LQ#S\WKRQ#0#SDUWH#44
dwwhq}lrqh#dl#wdj#vhjxhqwl= frqqhvvlrqh#zhe#h#lql}lhuhpr#d# fhufduh#l#qrvwul#wdj1#Xqd#yrowd# wurydwr#xq#wdj#fkh#fl#lqwhuhvvd/# vdoyhuhpr#txhvwr#whvwr#lq#xqd# yduldeloh#fkh#srvvldpr#xvduh#lq# vhjxlwr#shu#prvwuduh#o*rxwsxw1# Txdqgr#dyuhpr#d#glvsrvl}lrqh# wxwwl#l#gdwl#ol#prvwuhuhpr1# Deedvwdq}d#vhpsolfh#lq#whruld1 Lql}ldpr#fro#fkldpduh#lo#qrvwur# iloh#zbfxuuhqwv1s|1#Hffr#od#sduwh#gl# lpsruw#gho#qrvwur#frglfh=
from xml.etree import ElementTree as ET import urllib import sys import getopt """ w_currents.py Returns current conditions, forecast and alerts for a given zipcode from WeatherUnderground.com. Usage: python wonderground.py [options] Options: -h, --help Show this help -l, --location City,State to use -z, --zip Zipcode to use as location Examples: w_currents.py -h (shows this help information) w_currents.py -z 80013 (uses the zip code 80013 as location) """

Qdwxudophqwh/#srwhwh# djjlxqjhuh#dowul#wdj#fkh#shu#yrl# vrqr#lqwhuhvvdqwl1#Frpxqtxh/# txhvwl#wdj#yl#iruqludqqr#xqd# sdqrudplfd#deedvwdq}d#frpsohwd1 Rud#fkh#vdssldpr#frvd#fl# lqwhuhvvd/#lql}ldpr#d#vfulyhuh#lo# frglfh#ghood#qrvwud#dssolfd}lrqh1# Rvvhuyldpr#lq#jhqhudoh#lo#ioxvvr# frpsohvvlyr#gho#surjudppd1 Sulpd#gl#wxwwr/#frqwurooldpr# frvd#o*xwhqwh#fl#kd#fklhvwr#gl#iduh1# Vh##vwdwd#iruqlwd#xqd#orfdolw#od# xvhuhpr#dowulphqwl#xwlol}}huhpr# txhood#suhghilqlwd1#Txlqgl# sdvvhuhpr#dood#ixq}lrqh# jhwFxuuhqwv1#Xvldpr#od#orfdolw# shu#frvwuxluh#od#qrvwud#vwulqjd#gl# ulfklhvwd#gd#lqylduh#do#vlwr#zhe1# Xvhuhpr#xuoole1xuorshq#shu# uhfxshuduh#od#ulvsrvwd#gdo#zhe/# phwwhuod#lq#xq#rjjhwwr#h#sdvvduor# dood#oleuhuld#HohphqwWuhh#shu#lo# sduvlqj1#Txlqgl#fklxghuhpr#od#

Txlqgl#lqvhuluhpr#xqd#vhulh#gl# olqhh#gl#dlxwr#+lq#dowr#d#ghvwud,# vrsud#jol#lpsruw1 Dvvlfxudwhyl#gl#xvduh#l#wulsol# grssl#dslfl1#Fl#shuphwwhu#gl# xvduh#frpphqwl#pxowl0uljd1# Sduohuhpr#gl#txhvwr#wud#srfr1 Rud#fuhhuhpr#od#qrvwud#fodvvh# vwxe/#lq#edvvr#d#ghvwud/#h#oh# urxwlqh#sulqflsdol/#fkh#vrqr# prvwudwh#qhood#sdjlqd#vhjxhqwh1 gvmm#djsdmf#nbhb{jof#$48

class CurrentInfo: """ This routine retrieves the current condition xml data from WeatherUnderground.com based off of the zip code or Airport Code... currently tested only with Zip Code and Airport code For location, if zip code use something like 80013 (no quotes) if airport use something like "KDEN" (use double-quotes) if city/state (US) use something like "Aurora,%20CO" or Aurora,CO (use double-quotes) if city/country, use something like "London,%20England" (use double-quotes) """ def getCurrents(self,debuglevel,Location): pass def output(self): pass def DoIt(self,Location): pass #========================================= # END OF CLASS CurrentInfo() #=========================================

lqglfh#a

SURJUDPPDUH#LQ#S\WKRQ#0#SDUWH#44
Ulfrughuhwh#gdjol#duwlfrol# suhfhghqwl#od#uljd#%libbqdphbb%1# Vh#od#fkldpldpr#frph# xq*dssolfd}lrqh#d#v#vwdqwh/#od# urxwlqh#sulqflsdoh#yhuu#hvhjxlwd/# dowulphqwl#od#srvvldpr#xvduh# frph#sduwh#gl#xqd#oleuhuld1#Xqd# yrowd#qhood#urxwlqh#sulqflsdoh/# frqwuroohuhpr/#vh##lo#fdvr/#frvd## vwdwr#wudvphvvr1 Vh#o*xwhqwh#xvd#lo#sdudphwur#%0 k%#r#%00#khos%/#prvwuhuhpr#oh#wulsoh# uljkh#g*dlxwr#doo*lql}lr#gho#frglfh# gho#surjudppd#dwwudyhuvr#od# fkldpdwd#d#xqd#urxwlqh#gl# vxssruwr#fkh#glfh#doo*dssolfd}lrqh# gl#prvwuduhbbgrfbb1 sdvvduod#dooh#urxwlqh1##txdofrvd# fkh#rupdl#gryuhvwh#hvvhuh#fdsdfl# gl#iduh1 Shu#ilqluh#fuhldpr#xq*lvwdq}d# ghood#qrvwud#fodvvh#FxuuhqwLqir# fkh#fkldpldpr#fxuuhqwv/#h#txlqgl# sdvvldpr#od#orfdolw#dood#Urxwlqh# %GrLw%1#Hffr#frph##idwwd=
def DoIt(self,Location): self.getCurrents(1,Location) self.output() def usage(): print __doc__ def main(argv): location = 80013 try: opts, args = getopt.getopt(argv, "hz:l:", ["help=", "zip=", "location="]) except getopt.GetoptError: usage() sys.exit(2) for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit() elif opt in ("-l", "--location"): location = arg elif opt in ("-z", "--zip"): location = arg print "Location = %s" % location currents = CurrentInfo() currents.DoIt(location) #============================================ # Main loop #============================================ if __name__ == "__main__": main(sys.argv[1:])

Prowr#vhpsolfh1#Sdvvldpr#od# orfdolw#h#lo#olyhoor#gl#ghexj#dood# urxwlqh#jhwFxuuhqwv/#h#txlqgl# fkldpldpr#od#urxwlqh#gl#rxwsxw1# Vh#o*xwhqwh#xvd#%0o%#+orfdolw,#r#%0 Dqfkh#vh#dyuhppr#srwxwr# }%#+frglfh#srvwdoh,#o*lqirupd}lrqh# vhpsolfhphqwh#hvhjxluh#o*rxwsxw# iruqlwd#vrvwlwxlu#txhood#lpsrvwdwd# gluhwwdphqwh#gdood#urxwlqh# lqwhuqdphqwh1#Txdqgr#vl#sdvvd# jhwFxuuhqwv/#vwldpr#vyloxssdqgr# xqd#orfdolw/#dvvlfxudwhyl#gl#xvduh#l# od#iohvvlelolw#shu#iruqluh#o*rxwsxw#lq# grssl#dslfl#shu#udffklxghuh#od# gliihuhqwl#prgl#qho#fdvr#qh# vwulqjd#h#gl#qrq#xvduh#vsd}l1#Shu# gryhvvlpr#dyhu#elvrjqr1 hvhpslr/#shu#uhfxshuduh#oh#dwwxdol# frqgl}lrql#gl#Gdoodv/#Wh{dv/#xvduh#0 Lo#frglfh#shu#od#urxwlqh# o#%Gdoodv/Wh{dv%1 jhwFxuuhqwv##prvwudwr#qhood# sdjlqd#vhjxhqwh1 L#ohwwrul#sl#dvwxwl#dyudqqr#jl# lqwxlwr#fkh#l#frqwurool#0}#h#0o#vrqr# Txl#deeldpr#xq#sdudphwur# suhvvrfk#od#vwhvvd#frvd1#Srwhwh# fkldpdwr#ghexjohyho1#Lo#vxr# prglilfduh#0o#shu#frqwurooduh#od# xwlol}}r#fl#shuphwwh#gl#frqwurooduh# hyhqwxdoh#suhvhq}d#gl#vsd}l#h# lqirupd}lrql#xwlol#qho#fdvr#lo# ulirupdwwduh#od#vwulqjd#sulpd#gl# gvmm#djsdmf#nbhb{jof#$48

surjudppd#qrq#vl#frpsruwdvvh# qhood#pdqlhud#dvshwwdwd1##dqfkh# xwloh#doo*lql}lr#ghood#idvh#gl# vyloxssr1#Vh#srl#vlhwh#frqwhqwl#gl# frph#lo#yrvwur#frglfh#ixq}lrqd/# srwhwh#ulpxryhuh#rjql#wudffld# uhodwlyd#d#ghexjohyho1#Vh#dyhwh# lqwhq}lrqh#gl#ulodvflduh#lo#frglfh#do# sxeeolfr/#frph#vh#or#vwhvwh# idfhqgr#shu#txdofxq#dowur/# dvvlfxudwhyl#gl#ulpxryhuh#lo#frglfh#

h#gl#whvwduor#qxrydphqwh#sulpd#gl# ulodvflduor1 Dghvvr#xvldpr#od#ixq}lrqh# wu|2h{fhsw#shu#dvvlfxudufl#fkh# dqfkh#vh#txdofrvd#dqgdvvh# vwruwr/#lo#surjudppd#qrq#hvsorgd1# Qhood#vh}lrqh#wu|#lpsrvwldpr# o*XUO#h#xq#wlphu#gl#;#vhfrqgl# +xuoole1vrfnhw1vhwghidxowwlphrxw+;,,


lqglfh#a

SURJUDPPDUH#LQ#S\WKRQ#0#SDUWH#44
1#Idffldpr#txhvwr#shufk/#d#yrowh/# zxqghujurxqg##rffxsdwr#h#qrq# ulvsrqgh1#Lq#txhvwd#pdqlhud#vl# hylwd#gl#gryhu#dvshwwduh# doo*lqilqlwr1#Vh#vlhwh#lqwhuhvvdwl#d# xowhulrul#lqirupd}lrql#vx#xuoole#xq# exrq#srvwr#gd#fxl#lql}lduh## kwws=22grfv1s|wkrq1ruj2oleudu|2xuoole 1kwpo1 Vh#dffdgh#txdofrvd#gl# lqdvshwwdwr#vl#sdvvd#qhood#vh}lrqh# h{fhsw#fkh#vwdpsd#xq#phvvdjjlr# gl#huuruh#h#whuplqd#o*dssolfd}lrqh# +v|v1h{lw+5,,1 Dvvxphqgr#fkh#wxwwr#ixq}lrql/# lql}ldpr#d#fhufduh#l#qrvwul#wdj1#Od# sulpd#frvd#fkh#iduhpr##fhufduh# od#qrvwud#orfdolw#frq# wuhh1ilqgdoo+%22ixoo%,1#Ulfrugdwh/#wuhh# #o*rjjhwwr#dqdol}}dwr#uhvwlwxlwr#gd# hohphqwwuhh1#Lq#edvvr##prvwudwr# sduwh#gl#fl#fkh#ylhqh#ulwruqdwr# gdoo*DSL#gho#vlwr1 Txhvwd##od#qrvwud#sulpd# lvwdq}d#gho#wdj#?ixooA/#fkh#lq# txhvwr#fdvr##%Dxurud/#FR%1# Txhvwd##od#orfdolw#fkh#yrjoldpr# xvduh1#Txlqgl#fhufkldpr# %revhuydwlrqbwlph%1#Udssuhvhqwd# lo#prphqwr#gl#uhjlvwud}lrqh#ghooh# dwwxdol#frqgl}lrql1#Frqwlqxldpr# fhufdqgr#wxwwl#l#gdwl#fkh#fl# lqwhuhvvdqr#0#xvdqgr#od#vwhvvd# phwrglfd1 Shu#ilqluh#fl#rffxsldpr#ghood# qrvwud#urxwlqh#gl#rxwsxw#fkh## prvwudwd#lq#dowr#d#vlqlvwud#qhood# sdjlqd#vhjxhqwh1 Txl#vhpsolfhphqwh#prvwuldpr# oh#yduldelol1 Txhvwr##wxwwr1#Xq#rxwsxw# g*hvhpslr#shu#lo#plr#frglfh# srvwdoh#frq#xq#ghexjohyho#vhwwdwr# d#4##prvwudwr#lq#edvvr#d#vlqlvwud# qhood#survvlpd#sdjlqd1
def getCurrents(self,debuglevel,Location): if debuglevel > 0: print "Location = %s" % Location try: CurrentConditions = 'http://api.wunderground.com/auto/wui/geo/WXCurrentObXML /index.xml?query=%s' % Location urllib.socket.setdefaulttimeout(8) usock = urllib.urlopen(CurrentConditions) tree = ET.parse(usock) usock.close() except: print 'ERROR - Current Conditions - Could not get information from server...' if debuglevel > 0: print Location sys.exit(2) # Get Display Location for loc in tree.findall("//full"): self.location = loc.text # Get Observation time for tim in tree.findall("//observation_time"): self.obtime = tim.text # Get Current conditions for weather in tree.findall("//weather"): self.we = weather.text # Get Temp for TempF in tree.findall("//temperature_string"): self.tmpB = TempF.text #Get Humidity for hum in tree.findall("//relative_humidity"): self.relhum = hum.text # Get Wind info for windstring in tree.findall("//wind_string"): self.winds = windstring.text # Get Barometric Pressure for pressure in tree.findall("//pressure_string"): self.baroB = pressure.text

<display_location> <full>Aurora, CO</full> <city>Aurora</city> <state>CO</state> <state_name>Colorado</state_name> <country>US</country> <country_iso3166>US</country_iso3166> <zip>80013</zip> <latitude>39.65906525</latitude> <longitude>-104.78105927</longitude> <elevation>1706.00000000 ft</elevation> </display_location>

jhwFxuuhqwv#urxwlqh

gvmm#djsdmf#nbhb{jof#$48

lqglfh#a

SURJUDPPDUH#LQ#S\WKRQ#0#SDUWH#44
def output(self): print 'Weather Information From Wunderground.com' print 'Weather info for %s ' % self.location print self.obtime print 'Current Weather - %s' % self.we print 'Current Temp - %s' % self.tmpB print 'Barometric Pressure - %s' % self.baroB print 'Relative Humidity - %s' % self.relhum print 'Winds %s' % self.winds

Vl#suhjd#gl#qrwduh#fkh#kr# vfhowr#gl#xvduh#l#wdj#fkh#lqfoxgrqr# l#ydorul#vld#lq#Idkuhqkhlw#fkh# Fhovlxv1#Vh#ghvlghudwh/#shu# hvhpslr/#ylvxdol}}duh#vror#l#ydorul# Fhovlxv#srwhwh#xvduh#lo#wdj# ?whpsbfA#slxwwrvwr#fkh# ?whpshudwxuhbvwulqjA1 O*lqwhur#frglfh#sx#hvvhuh# vfdulfdwr#gd=# kwws=22sdvwhelq1frp27leMJp:7

Od#survvlpd#yrowd#fl# frqfhqwuhuhpr#vxood#sduwh# suhylvlrqdoh#ghooh#DSL1#Qho# iudwwhpsr/#exrq#glyhuwlphqwr$ Lo# pdl$

Gvmm#Djsdmf# Qpedbtu
##wruqdwr#h#pljolruh#fkh# Jol#dujrphqwl#qhoo*hslvrglr#txdwwur#lqfoxgrqr= #Qhzv#0#ulodvfldwr#Xexqwx#43137 #Rslqlrql #Jlrfkl#0#Vwhdp#duulyd#vx#Olqx{B #Ihhgedfn 111h#wxwwr#lo#vrolwr#xprulvpr1

##lo#sursulhwdulr# ghood# /# xqd#vrflhw#gl#frqvxohq}d#lq# Dxurud/#Frorudgr#h#surjudppd# gdo#4<:51#Dpd#fxflqduh/#iduh# hvfxuvlrql/#dvfrowduh#pxvlfd#h# sdvvduh#lo#whpsr#frq#od#vxd# idpljold1

Location = 80013 Weather Information From Wunderground.com Weather info for Aurora, Colorado Last Updated on May 3, 11:55 AM MDT Current Weather - Partly Cloudy Current Temp - 57 F (14 C) Barometric Pressure - 29.92 in (1013 mb) Relative Humidity - 25% Winds From the WNW at 10 MPH Script terminated.

-#Urelq#Fdwolqj -#Hg#Khzlww -#Gdyh#Zlonlqv Lo#srgfdvw#h#oh#uhodwlyh#qrwh#ol#wurydwh#vx= kwws=22ixooflufohpdjd}lqh1ruj2

gvmm#djsdmf#nbhb{jof#$48

lqglfh#a

Scritto da Greg Walters

KRZ0WR

Surjudppduh lq S|wkrq 0 Sduwh 45


per le prossime 24 ore. Non ricordo di aver visto mai un valore Dopo l'elemento precursore inferiore a 2. Per ciascuna txt_forecast abbiamo la data, un previsione nelle 24 ore elemento "number", quindi un (<forecastday>), avrete un elemento chiamato forecastday <period> numerico, opzioni che ha a sua volta dei figli che includono period, icon, icons, title multiple per le icone, un'opzione e qualcosa chiamato fcttext... e a per il titolo ("Today", "Tonight", "Tomorrow") ed il testo riassuntivo seguire una ripetizione dello della previsione. Questa stesso. La prima cosa che un'anteprima rapida della noterete in txt_forecast che la data non una data ma un valore previsione, di solito per le temporale. Si tratta del momento successive 12 ore. in cui stata fatta la previsione. Prima di iniziare a lavorare con L'etichetta <number> mostra il nostro codice dovremmo dare quante previsioni sono presenti
<txt_forecast> <date>3:31 PM MDT</date> <number>2</number> <forecastday> <period>1</period> <icon>nt_cloudy</icon> +<icons></icons> <title>Tonight</title> <fcttext> Mostly cloudy with a 20 percent chance of thunderstorms in the evening...then partly cloudy after midnight. Lows in the mid 40s. Southeast winds 10 to 15 mph shifting to the south after midnight. </fcttext> </forecastday> +<forecastday></forecastday> </txt_forecast>

VEDI ANCHE: VALIDO PER: CATEGORIE :

FCM#27-37 - Python Parti 1 - 11

web per le condizioni attuali, ce ne uno per le previsioni. Ecco il link alla pagina delle previsioni XML: http://api.wunderground.com/auto /wui/geo/ForecastXML/index.xml?q uery=80013 Come al solito, sostituite '80013' con la vostra Citt/Paese, Citt/Stato o codice postale. Probabilmente otterrete circa 600 righe di codice XML. C' un elemento root chiamato 'forecast' e quindi quattro sotto elementi: 'termsofservice', 'txt_forecast', 'simpleforecast' and 'moon_phase'. Ci concentreremo su 'txt_forecast' e 'simpleforecast'. Poich l'ultima volta abbiamo gi trattato delle sezioni usage, main e "if__name__", quelle le lascer affrontare a voi e ci focalizzeremo sulle chicche di cui abbiamo bisogno questa volta. Poich vi ho mostrato una porzione di txt_forecast, iniziamo da qui. In basso mostrata una piccola porzione di txt_forecast per la mia zona.
gvmm djsdmf nbhb{jof $49

Sviluppo Grafica Internet M/media Sistema

DISPOSITIVI:

CD/DVD

HDD

USB Drive Laptop Wireless

ell'ultima sessione, abbiamo trattato l'API di wunderground e scritto un po' di codice per ricavare le condizioni attuali. Questa volta ci occuperemo della parte delle API riguardante le previsioni. Se non avete avuto modo di dare un'occhiata alle ultime due puntate su XML, ed in particolare l'ultima, dovreste farlo prima di procedere ulteriormente. Cos come esiste un indirizzo

indice ^

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 45 un'occhiata alla porzione _init_ per impostare e pulire le <simpleforecast> del file xml che variabili necessarie, come mostrato a destra. mostrato in alto a destra nella pagina seguente. C' un'etichetta <forecastday> per ciascun giorno del periodo di Se non vi interessa supportare previsione, di solito 6 giorni sia Fahrenheit che Celsius, incluso quello attuale. Avete escludete la viariabile che non vi informazioni sulla data in vari interessa. Io ho deciso di tenerle formati (io personalmente entrambe. preferisco l'etichetta <pretty>), temperature massime e minime A seguire, creeremo la nostra previste sia in Fahrenheit che routine principale per recuperare i Celsius, proiezione delle condizioni dati della previsione. mostrata generali, varie icone, una icona in basso a destra nella pagina del cielo (condizioni del cielo alla successiva. stazione di riferimento), e "pop" che sta per "Probabilit di molto simile alla routine della Precipitazione". L'etichetta volta scorsa per le condizioni <moon_phase> fornisce alcune attuali. La differenza principale informazioni interessanti come (finora) l'URL utilizzato. Ora le alba, tramonto e fasi lunari. cose cambiano. Dato che abbiamo figli multipli con la stessa Ora ci addentriamo nel codice. etichetta all'interno del genitore Ecco la sezione degli import: dobbiamo modificare in parte le nostre chiamate all'analizzatore. Il from xml.etree import codice mostrato in alto a sinistra ElementTree as ET nella pagina seguente.
import urllib import sys import getopt

Dobbiamo ora creare la nostra classe. Creeremo una routine

Notate come questa volta si stia usando tree.find, ed i cicli per scorrere i dati. un peccato che Python non fornisca un costrutto SELECT/CASE come in altri linguaggi. La routine IF/ELIF,
gvmm djsdmf nbhb{jof $49

<simpleforecast> <forecastday> <period>1</period> <date> <epoch>1275706825</epoch> <pretty_short>9:00 PM MDT</pretty_short> <pretty>9:00 PM MDT on June 04, 2010</pretty> <day>4</day> <month>6</month> <year>2010</year> <yday>154</yday> <hour>21</hour> <min>00</min> <sec>25</sec> <isdst>1</isdst> <monthname>June</monthname> <weekday_short/> <weekday>Friday</weekday> <ampm>PM</ampm> <tz_short>MDT</tz_short> <tz_long>America/Denver</tz_long> </date> <high> <fahrenheit>92</fahrenheit> <celsius>33</celsius> </high> <low> <fahrenheit>58</fahrenheit> <celsius>14</celsius> </low> <conditions>Partly Cloudy</conditions> <icon>partlycloudy</icon> +<icons> <skyicon>partlycloudy</skyicon> <pop>10</pop> </forecastday> ... </simpleforecast>

indice ^

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 45


class ForecastInfo: def __init__(self): self.forecastText = [] # Today/tonight forecast information self.Title = [] # Today/tonight self.date = '' self.icon = [] # Icon to use for conditions today/tonight self.periods = 0 self.period = 0 #============================================== # Extended forecast information #============================================== self.extIcon = [] # Icon to use for extended forecast self.extDay = [] # Day text for this forecast ("Monday", "Tuesday" etc) self.extHigh = [] # High Temp. (F) self.extHighC = [] # High Temp. (C) self.extLow = [] # Low Temp. (F) self.extLowC = [] # Low Temp. (C) self.extConditions = [] # Conditions text self.extPeriod = [] # Numerical Period information (counter) self.extpop = [] # Percent chance Of Precipitation

#================================= # Get the forecast for today and (if available) tonight #================================= fcst = tree.find('.//txt_forecast') for f in fcst: if f.tag == 'number': self.periods = f.text elif f.tag == 'date': self.date = f.text for subelement in f: if subelement.tag == 'period': self.period=int(subelement.text) if subelement.tag == 'fcttext': self.forecastText.append(subelement.text) elif subelement.tag == 'icon': self.icon.append( subelement.text) elif subelement.tag == 'title': self.Title.append(subelement.text)

def GetForecastData(self,location): try: forecastdata = 'http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=%s' % location urllib.socket.setdefaulttimeout(8) usock = urllib.urlopen(forecastdata) tree = ET.parse(usock) usock.close() except: print 'ERROR - Forecast - Could not get information from server...' sys.exit(2)

gvmm djsdmf nbhb{jof $49

indice ^

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 45 pagina seguente. comunque, funziona a dovere, solo un po' pi arzigogolata. Ora Ancora, se non volete mostrare analizziamo il codice. Assegnamo le informazioni sia in Centigradi la variabile fcst ad ogni cosa che in Fahrenheit, modificate il all'interno dell'etichetta <txt_forecast> che cos includer codice per mostrare quello che tutti i dati per quel gruppo. Quindi volete. Per finire abbiamo la cerchiamo le etichette <date> e routine "DoIt": <number> dato che sono def semplici etichette di "primo livello" e carichiamo i dati nelle DoIt(self,Location,US,IncludeTo day,Output): nostre variabili. Ora le cose si fanno un po' pi difficili. Guardate al nostro esempio xml di risposta. self.GetForecastData(Location) Ci sono due istanze di <forecastday>. Sotto self.output(US,IncludeToday,Out put) <forecastday> ci sono i sottoelementi <period>, <icon>, Ora possiamo chiamare la <icons>, <title> e <fcttext>. Li passeremo in rassegna ed ancora routine come segue: utilizziamo l'istruzione IF per forecast = ForecastInfo() caricarli nelle nostre variabili.
Ora dobbiamo dare un'occhiata forecast.DoIt('80013',1,0,0) # Insert your own postal code ai dati sulle previsioni estese per i successivi X giorni. Questo tutto per ora. Lascio il Fondamentalmente ricorriamo allo codice per i controlli a voi, se stesso metodo usato per volete cimentarvi. assegnare le nostre variabili; questo mostrato in alto a destra. Ecco il codice eseguibile completo: Adesso dobbiamo creare la http://pastebin.com/wsSXMXQx nostra routine per l'output. Come abbiamo fatto l'ultima volta, sar Divertitevi fino alla abbastanza generico. Il codice per prossima volta. fare ci mostrato a destra nella
gvmm djsdmf nbhb{jof $49

#================================= # Now get the extended forecast #================================= fcst = tree.find('.//simpleforecast') for f in fcst: for subelement in f: if subelement.tag == 'period': self.extPeriod.append(subelement.text) elif subelement.tag == 'conditions': self.extConditions.append(subelement.text) elif subelement.tag == 'icon': self.extIcon.append(subelement.text) elif subelement.tag == 'pop': self.extpop.append(subelement.text) elif subelement.tag == 'date': for child in subelement.getchildren(): if child.tag == 'weekday': self.extDay.append(child.text) elif subelement.tag == 'high': for child in subelement.getchildren(): if child.tag == 'fahrenheit': self.extHigh.append(child.text) if child.tag == 'celsius': self.extHighC.append(child.text) elif subelement.tag == 'low': for child in subelement.getchildren(): if child.tag == 'fahrenheit': self.extLow.append(child.text) if child.tag == 'celsius': self.extLowC.append(child.text)

Greg Walters il proprietario

della RainyDay Solutions, LLC, una societ di consulenza in Aurora, Colorado e programma dal 1972. Ama cucinare, fare escursioni, ascoltare musica e passare il tempo con la sua famiglia.

10

indice ^

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 45


def output(self,US,IncludeToday,Output): # US takes 0,1 or 2 # 0 = Centigrade # 1 = Fahrenheit # 2 = both (if available) # Now print it all if Output == 0: for c in range(int(self.period)): if c <> 1: print '-------------------------------' print 'Forecast for %s' % self.Title[c].lower() print 'Forecast = %s' % self.forecastText[c] print 'ICON=%s' % self.icon[c] print '-----------------------------------' print 'Extended Forecast...' if IncludeToday == 1: startRange = 0 else: startRange = 1 for c in range(startRange,6): print self.extDay[c] if US == 0: #Centigrade information print '\tHigh - %s(C)' % self.extHigh[c] print '\tLow - %s(C)' % self.extLow[c] elif US == 1: #Fahrenheit information print '\tHigh - %s(F)' % self.extHigh[c] print '\tLow - %s(F)' % self.extLow[c] else: #US == 2 both(if available) print '\tHigh - %s' % self.extHigh[c] print '\tLow - %s' % self.extLow[c] if int(self.extpop[c]) == 0: print '\tConditions - %s.' % self.extConditions[c] else: print '\tConditions - %s. %d%% chance of precipitation.' % (self.extConditions[c],int(self.extpop[c]))

Gvmm Djsdmf Qpedbtu


Il Podcast di Full Circle tornato e migliore che mai! Gli argomenti nell'episodio otto includono: News - sviluppo di Maverick Intervista a Lubuntu Giochi - Ed recensisce Osmos Feedback ...e tutto il solito umorismo.
I c on d u ttori :

Robin Catling Ed Hewitt Dave Wilkins


Il podcast e le relative note li trovate su: http: //fullcirclemagazine.org/

gvmm djsdmf nbhb{jof $49

11

indice ^

Vfulwwr gd Juhj Zdowhuv

KRZ0WR

Surjudppduh lq S|wkrq 0 Sduwh 46


#!/usr/bin/env python # CursesExample1 #------------------------------# Curses Programming Sample 1 #------------------------------import curses myscreen = curses.initscr() myscreen.border(0) myscreen.addstr(12, 25, "See Curses, See Curses Run!") myscreen.refresh() myscreen.getch() curses.endwin()

xhvwr phvh sduohuhpr ghoo*xvr gl Fxuvhv lq S|wkrq1 Qr/ qrq vwldpr glfhqgr gl xvduh S|wkrq shu gluh sdurodffh/ ehqfk srvvldwh lq fdvr qh vhqwldwh lo elvrjqr1 Vwldpr sduodqgr ghoo*xwlol}}r ghood oleuhuld Fxuvhv shu fuhduh txdofkh vwudydjdqwh rxwsxw ghoor vfkhupr1 Vh vlhwh yhffkl deedvwdq}d gd ulfrugduh l sulpl whpsl ghl frpsxwhu/ ulfrughuhwh fkh/ lq dpelwr odyrudwlyr/ l frpsxwhu hudqr wxwwl pdlqiudph 0 frq vhpsolfl whuplqdol +vfkhupl h wdvwlhuh, shu o*lqsxw h o*rxwsxw1 Srwhydwh dyhuh sl whuplqdol froohjdwl dg xq vror frpsxwhu1 Lo sureohpd hud fkh l whuplqdol ulvxowdydqr glvsrvlwlyl qrlrvl1 Qrq dyhydqr ilqhvwuh/ frorul r frvh gho jhqhuh 0 vror 57 uljkh gl ;3 fdudwwhul +qhooh pljolrul ghooh lsrwhvl,1 Txdqgr l shuvrqdo frpsxwhu glyhqqhur srsrodul/ dl whpsl gl GRV h FSP/ txhvwr txhoor fkh fl vl ulwurydyd1 Txdqgr l surjudppdwrul odyrudydqr vxl orur vwudydjdqwl +shu txhl whpsl, vfkhupl/ vrsudwwxwwr shu

o*lpplvvlrqh h ylvxdol}}d}lrqh gl gdwl/ xvdydqr fduwd judilfd shu glvhjqduh lo frqwhqxwr ghoor vfkhupr1 Fldvfxq eorffr vxood fduwd judilfd udssuhvhqwdyd od srvl}lrqh gl xq fdudwwhuh1 Txdqgr xvldpr l qrvwul surjudppl lq S|wkrq qho whuplqdoh/ dqfrud deeldpr d fkh iduh frq xqr vfkhupr 57{;31 Frpxqtxh/ txhood olplwd}lrqh sx hvvhuh idflophqwh vxshudwd frq xq*dghjxdwd dffruwh}}d h suhsdud}lrqh1 Txlqgl uhfdwhyl yhuvr lo sl ylflqr qhjr}lr gl duwlfrol gl fdqfhoohuld h surfxudwhyl txdofkh eorffkhwwr gl fduwd judilfd1 Dg rjql prgr/ suhsduldprfl d fuhduh lo qrvwur sulpr surjudppd Fxuvhv/ prvwudwr lq dowr d ghvwud1 Yh or vslhjkhu grsr fkh dyuhwh gdwr xq*rffkldwd do frglfh1 Euhyh pd vhpsolfh1 Hvdplqldpror uljd shu uljd1 Shu lql}lduh/ lqvhuldpr jol lpsruw/ fkh rupdl gryuheehur hvvhuyl idploldul1 Lq vhjxlwr/ fuhhuhpr xq qxryr rjjhwwr Fxuvhu shu or vfkhupr/ or lql}ldol}}huhpr h or fkldphuhpr p|vfuhhq1 +p|vfuhhq @ gvmm djsdmf nbhb{jof $4:

fxuvhv1lqlwvfu+,,1 Txhvwd od qrvwud whod fkh glslqjhuhpr1 Txlqgl/ xvldpr lo frpdqgr p|vfuhhq1erughu+3, shu glvhjqduh xq pdujlqh lqwruqr dood whod1 Qrq qhfhvvdulr pd uhqgh or vfkhupr sl judghyroh1 Txlqgl xvldpr lo phwrgr dggvwu shu %vfulyhuh% vxood qrvwud whod d sduwluh gdood uljd 45 srvl}lrqh 581 Shqvdwh do phwrgr 1dggvwu gl Fxuvhv frph dg xq*lvwux}lrqh sulqw1 Shu ilqluh/ lo phwrgr 1uhiuhvk+, uhqghu lo qrvwur odyrur ylvleloh1 Vh qrq ulfdulfkldpr or vfkhupr/ l qrvwul fdpeldphqwl qrq vdudqqr ylvlelol1 Txlqgl dvshwwldpr fkh o*xwhqwh suhpd xq wdvwr +1jhwfk, h srl ulodvfldpr o*rjjhwwr vfkhupr +1hqgzlq, shu shuphwwhuh do qrvwur whuplqdoh gl :

wruqduh dood qrupdolw1 Lo frpdqgr fxuvhv1hqgzlq+, PROWR lpsruwdqwh h/ vh qrq ylhqh ulfkldpdwr/ lo yrvwur whuplqdoh ulvxowhu lq xqr vwdwr gl judqgh glvruglqh1 Dvvlfxudwhyl txlqgl gl xvduh txhvwr phwrgr sulpd ghood ilqh ghoo*dssolfd}lrqh1 Vdoydwh txhvwr surjudppd frph FxuvhvH{dpsoh41s| hg hvhjxlwhor lq xq whuplqdoh1 Dofxqh frvh gd qrwduh1 Rjqltxdoyrowd xvdwh xq erugr/ txhvwr vsuhfd xq fdudwwhuh %xwlol}}deloh% shu fldvfxq hohphqwr gho erugr vwhvvr1 Lq djjlxqwd/ vld od srvl}lrqh ghood olqhd fkh gho fdudwwhuh ylhqh frqwhjjldwd d sduwluh gd ]HUR1
lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 46


Txhvwr vljqlilfd fkh od sulpd uljd vxo qrvwur vfkhupr od olqhd 3 h o*xowlpd od 561 Frv/ od srvl}lrqh lq dowr d vlqlvwud ulihulwd 3/3 h txhood lq edvvr d ghvwud 56/:<1 Idffldpr xq slffror hvhpslr +lq dowr d ghvwud, shu glprvwuduh txhvwr1 Wxwwr prowr vhpsolfh hffhwwr fkh shu l eorffkl wu|2ilqdoo|1 Ulfrugdwh/ kr ghwwr fkh fxuvhv1hqgzlq PROWR lpsruwdqwh h ghyh hvvhuh ulfkldpdwr sulpd fkh o*dssolfd}lrqh whuplql1 Ehqh/ lq txhvwd pdqlhud/ dqfkh vh oh frvh vl phwwrqr pdoh/ od urxwlqh hqgzlq yhuu ulfkldpdwd1 Fl vrqr prowl prgl gl iduor/ pd txhvwr pl vhpeud deedvwdq}d vhpsolfh1 Rud fuhldpr xq phqx gl vlvwhpd fdulqr1 Vh ulfrugdwh whpsr dgglhwur uhdol}}dppr o*dssolfd}lrqh frrnerrn fkh dyhyd xq phqx +Surjudppduh lq S|wkrq 0 Sduwh ;,1 Wxwwr qho whuplqdoh vfruuhyd vhpsolfhphqwh yhuvr o*dowr txdqgr vwdpsdydpr d vfkhupr txdofrvd1 Txhvwd yrowd suhqghuhpr txhoo*lghd h fuhhuhpr xq vhpsolfh phqx fkh srwuhwh xwlol}}duh shu deehooluh frrnerrn1 Lq edvvr prvwudwr fl fkh xwlol}}dppr doorud1 Txhvwd yrowd xvhuhpr Fxuvhv1 Lql}ldpr frq lo vhjxhqwh prghoor1 Suredelophqwh yruuhwh vdoyduh txhvwr iudpphqwr gl frglfh +lq edvvr d ghvwud, shu srwhuor xwlol}}duh qhl yrvwul surjudppl ixwxul1 Rud vdoydwh dqfrud lo yrvwur
#!/usr/bin/env python # CursesExample2 import curses #========================================================== # MAIN LOOP #========================================================== try: myscreen = curses.initscr() myscreen.clear() myscreen.addstr(0,0,"0 1 2 3 4 5 6 7") myscreen.addstr(1,0,"12345678901234567890123456789012345678901 234567890123456789012345678901234567890") myscreen.addstr(10,0,"10") myscreen.addstr(20,0,"20") myscreen.addstr(23,0, "23 - Press Any Key to Continue") myscreen.refresh() myscreen.getch() finally: curses.endwin() #!/usr/bin/env python #------------------------------# Curses Programming Template #------------------------------import curses def InitScreen(Border): if Border == 1: myscreen.border(0) #========================================================== # MAIN LOOP #========================================================== myscreen = curses.initscr() InitScreen(1) try: myscreen.refresh() # Your Code Stuff Here... myscreen.addstr(1,1, "Press Any Key to Continue") myscreen.getch() finally: curses.endwin()

=================================================== RECIPE DATABASE =================================================== 1 - Show All Recipes 2 - Search for a recipe 3 - Show a Recipe 4 - Delete a recipe 5 - Add a recipe 6 - Print a recipe 0 - Exit =================================================== Enter a selection ->

gvmm djsdmf nbhb{jof $4:

lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 46


prghoor frph %fxuvhvphqx41s|% frvlffk srvvldpr odyruduh vxo iloh h pdqwhqhuh lo prghoor1 Sulpd gl surfhghuh xowhulruphqwh frq lo frglfh/ suhsduldprfl dg xq dssurfflr prgxoduh1 Txl +lq dowr d ghvwud, f* xq hvhpslr lq svhxgr0frglfh gl txhoor fkh dqguhpr d uhdol}}duh1 Ryyldphqwh txhvwr svhxgr0 frglfh vror111 svhxgr1 Pd yl g xq*lghd vxoo*lqglul}}r gho surjhwwr jhqhudoh1 Gdwr fkh vl wudwwd vror gl xq hvhpslr/ qrq fl gloxqjkhuhpr rowuh lq txhvwd vhgh/ pd vlhwh olehul gl sruwduor d frpslphqwr1 Lql}ldpr frq lo flfor sulqflsdoh +do fhqwur/ doo*hvwuhpd ghvwud,1 Qrq f* prowr gd surjudppduh txl1 Deeldpr l qrvwul eorffkl wu|ilqdoo| frv frph ol dyhydpr qho prghoor1 Lql}ldol}}ldpr or vfkhupr Fxuvhv h txlqgl ulfkldpldpr xqd urxwlqh fkldpdwd OrjlfOrrs1 Lo vxr frglfh prvwudwr lq edvvr/ doo*hvwuhpd ghvwud1 Dqfrud/ qrq prowr/ pd vror xq hvhpslr1 Txl lqyrfkhuhpr gxh ixq}lrql1 Xqd fkldpdwd GrPdlqPhqx h o*dowud PdlqLqNh|1 GrPdlqPhqx prvwuhu lo qrvwur
curses.initscreen LogicLoop ShowMainMenu MainInKey While Key != 0: If Key == 1: ShowAllRecipesMenu Inkey1 ShowMainMenu If Key == 2: SearchForARecipeMenu InKey2 ShowMainMenu If Key == 3: ShowARecipeMenu InKey3 ShowMainMenu # And curses.endwin()

# Show the main menu # This is our main input handling routine # Show the All Recipes Menu # Do the input routines for this # Show the main menu # Show the Search for a Recipe Menu # Do the input routines for this option # Show the main menu again # Show the Show a recipe menu routine # Do the input routine for this routine # Show the main menu again so on and so on # Restore the terminal

def DoMainMenu(): myscreen.erase() myscreen.addstr(1,1, "========================================") myscreen.addstr(2,1, " Recipe Database") myscreen.addstr(3,1, "========================================") myscreen.addstr(4,1, " 1 - Show All Recipes") myscreen.addstr(5,1, " 2 - Search for a recipe") myscreen.addstr(6,1, " 3 - Show a recipe") myscreen.addstr(7,1, " 4 - Delete a recipe") myscreen.addstr(8,1, " 5 - Add a recipe") myscreen.addstr(9,1, " 6 - Print a recipe") myscreen.addstr(10,1, " 0 - Exit") myscreen.addstr(11,1, "========================================") myscreen.addstr(12,1, " Enter a selection: ") myscreen.refresh()

# MAIN LOOP try: myscreen = curses.initscr() LogicLoop() finally: curses.endwin()

def LogicLoop(): DoMainMenu() MainInKey()

gvmm djsdmf nbhb{jof $4:

<

lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 46


phqx sulqflsdoh/ phqwuh PdlqLqNh| Vl wudwwd gl xqd ixq}lrqh jhvwlu rjql dowud frvd gl txhvwr gdyyhur vhpsolfh1 Vl hqwud lq xq phqx sulqflsdoh1 Od urxwlqh flfor zkloh ilqfk lo wdvwr suhpxwr GrPdlqPhqx prvwudwd d ghvwud1 gdoo*xwhqwh xjxdoh d 31 Doo*lqwhuqr gho flfor/ frqwurooldpr vh xjxdoh Qrwdwh frph txhvwd ixq}lrqh d glyhuvl ydorul h/ vh frv/ odqfldpr qrq idffld dowur fkh sxoluh or xqd vhulh gl ixq}lrql h txdqgr vfkhupr +p|vfuhhq1hudvh, h txlqgl ilqlwr ulfkldpldpr lo phqx vwdpsduh txhoor fkh yrjoldpr1 Qrq sulqflsdoh1 Srwhwh frpsohwduh od f* qlhqwh txl fkh vl rffxsl ghood pdjjlru sduwh gl txhvwh ixq}lrql jhvwlrqh ghood wdvwlhud1 Txhvwr lo gd vrol/ pd gduhpr xq*rffkldwd odyrur ghood urxwlqh PdlqLqNh|/ fkh doo*rs}lrqh 5/ Vhdufk iru d Uhflsh1 prvwudwd lq edvvr1 Txhvwr phqx euhyh h jud}lrvr1
def MainInKey(): key = 'X' while key != ord('0'): key = myscreen.getch(12,22) myscreen.addch(12,22,key) if key == ord('1'): ShowAllRecipesMenu() DoMainMenu() elif key == ord('2'): SearchForARecipeMenu() InKey2() DoMainMenu() elif key == ord('3'): ShowARecipeMenu() DoMainMenu() elif key == ord('4'): NotReady("'Delete A Recipe'") DoMainMenu() elif key == ord('5'): NotReady("'Add A Recipe'") DoMainMenu() elif key == ord('6'): NotReady("'Print A Recipe'") DoMainMenu() myscreen.refresh()
def SearchForARecipeMenu(): myscreen.addstr(4,1, "-------------------------------") myscreen.addstr(5,1, " Search in") myscreen.addstr(6,1, "-------------------------------") myscreen.addstr(7,1, " 1 - Recipe Name") myscreen.addstr(8,1, " 2 - Recipe Source") myscreen.addstr(9,1, " 3 - Ingredients") myscreen.addstr(10,1," 0 - Exit") myscreen.addstr(11,1,"Enter Search Type -> ") myscreen.refresh() def InKey2(): key = 'X' doloop = 1 while doloop == 1: key = myscreen.getch(11,22) myscreen.addch(11,22,key) tmpstr = "Enter text to search in " if key == ord('1'): sstr = "'Recipe Name' for -> " tmpstr = tmpstr + sstr retstring = GetSearchLine(13,1,tmpstr) break elif key == ord('2'): sstr = "'Recipe Source' for -> " tmpstr = tmpstr + sstr retstring = GetSearchLine(13,1,tmpstr) break elif key == ord('3'): sstr = "'Ingredients' for -> " tmpstr = tmpstr + sstr retstring = GetSearchLine(13,1,tmpstr) break else: retstring = "" break if retstring != "": myscreen.addstr(15,1,"You entered - " + retstring) else: myscreen.addstr(15,1,"You entered a blank string") myscreen.refresh() myscreen.addstr(20,1,"Press a key") myscreen.getch() def GetSearchLine(row,col,strng): myscreen.addstr(row,col,strng) myscreen.refresh() instring = myscreen.getstr(row,len(strng)+1) myscreen.addstr(row,len(strng)+1,instring) myscreen.refresh() return instring

gvmm djsdmf nbhb{jof $4:

43

lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 46


Od ixq}lrqh LqNh|5 +d ghvwud, xq sr* sl frpsolfdwd1 Dqfrud/ vwldpr xvdqgr xq flfor zkloh vwdqgdug1 Lpsrvwldpr od yduldeloh grorrs @ 4/ frvlffk lo qrvwur flfor frqwlqxl vhq}d ilqh ilqfk qrq wuryldpr txhoor fkh yrjoldpr1 Xvldpr lo frpdqgr euhdn shu lqwhuurpshuh lo flfor1 Oh wuh rs}lrql vrqr prowr vlplol1 Od gliihuhq}d vrvwdq}ldoh fkh lql}ldpr frq xqd yduldeloh fkldpdwd wpsvwu/ h srl djjlxqjldpr xqd txdoxqtxh rs}lrqh fkh deeldpr vfhowr111 uhqghqgrod xq sr* sl dplfkhyroh1 Txlqgl fkldpldpr od ixq}lrqh JhwVhdufkOlqh shu rwwhqhuh od vwulqjd gd fhufduh1 Xvldpr od urxwlqh jhwvwu shu ulfhyhuh gdoo*xwhqwh xqd vwulqjd slxwwrvwr fkh xq fdudwwhuh1 Txlqgl uhvwlwxldpr od vwulqjd dood ixq}lrqh gl lqsxw shu o*hoderud}lrqh vxffhvvlyd1 Lo frglfh frpsohwr doo*lqglul}}r= kwws=22sdvwhelq1frp2HOx]6W7S Xq*xowlpd frvd1 Vh vlhwh lqwhuhvvdwl dg dssurirqgluh Fxuvhv/ fl vrqr prowl dowul phwrgl glvsrqlelol rowuh d txhool xwlol}}dwl txhvwr phvh1 Rowuh d iduh xqd ulfhufd frq Jrrjoh/ lo pljolru sxqwr gl sduwhq}d od grfxphqwd}lrqh xiilfldoh= kwws=22grfv1s|wkrq1ruj2oleudu|2fxuv hv1kwpo1 Dood survvlpd1 RRSV$ Vhpeud fkh lo frglfh shu S|wkrq Sw144 qrq vld vwdwr vwdpsdwr fruuhwwdphqwh vx Sdvwhelq1 O*lqglul}}r fruuhwwr shu lo frglfh = kwws=22sdvwhelq1frp2Sn:7iOI6 Frqvxowdwh dqfkh= kwws=22ixooflufohpdjd}lqh1sdvw helq1frp shu wxwwr lo frglfh S|wkrq +dqfkh ixwxur,1

Gvmm Djsdmf Qpedbtu


Lo Srgfdvw gl Ixoo Flufoh wruqdwr h pljolruh fkh pdl$ Jol dujrphqwl qhoo*hslvrglr glhfl lqfoxgrqr= Qhzv Rslqlrqh 0 Frqwulexluh djol duwlfrol frq lo uhgdwwruh gl IFP1 Lqwhuylvwd frq Dpehu Judqhu Ihhgedfn 111h wxwwr lo vrolwr xprulvpr1 L frqgxwwrul= Urelq Fdwolqj Hg Khzlww Urqqlh Wxfnhu Lo srgfdvw h oh uhodwlyh qrwh ol wurydwh vx= kwws=22ixooflufohpdjd}lqh1ruj2

Juhj Zdowhuv lo sursulhwdulr ghood Udlq|Gd| Vroxwlrqv/ OOF/ xqd vrflhw gl frqvxohq}d lq Dxurud/ Frorudgr h surjudppd gdo 4<:51 Dpd fxflqduh/ iduh hvfxuvlrql/ dvfrowduh pxvlfd h sdvvduh lo whpsr frq od vxd idpljold1

gvmm djsdmf nbhb{jof $4:

44

lqglfh a

Vfulwwr gd Juhj Zdowhuv

KRZ0WR

Surjudppduh lq S|wkrq 0 Sduwh 47


import curses try: myscreen = curses.initscr() curses.start_color() curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_GREEN) curses.init_pair(2, curses.COLOR_BLUE, curses.COLOR_WHITE) curses.init_pair(3, curses.COLOR_MAGENTA,curses.COLOR_BLACK) myscreen.clear() myscreen.addstr(3,1," This is a test ",curses.color_pair(1)) myscreen.addstr(4,1," This is a test ",curses.color_pair(2)) myscreen.addstr(5,1," This is a test ",curses.color_pair(3)) myscreen.refresh() myscreen.getch() finally: curses.endwin()

*xowlpd yrowd deeldpr wudwwdwr od oleuhuld Fxuvhv1 Txhvwd yrowd dssurirqgluhpr o*dujrphqwr frqfhqwudqgrfl vxl frpdqgl shu lo froruh1 Vh yl vlhwh shuvl o*duwlfror suhfhghqwh/ hffr xq euhyh uldvvxqwr1 Sulpd gl wxwwr gryhwh lpsruwduh od oleuhuld fxuvhv1 Txlqgl gryhwh lql}ldol}}duh frq fxuvhv1lqlwvfu1 Shu lqvhuluh lo whvwr vxoor vfkhupr vl fkldpd od ixq}lrqh dggvwu h txlqgl uhiuhvk shu prvwuduh l fdpeldphqwl1 Lqilqh fkldpdwh fxuvhv1hqgzlq+, shu ulsulvwlqduh od ilqhvwud gho whuplqdoh do vxr vwdwr qrupdoh1 Rud fuhhuhpr xq surjudppd vhpsolfh h yhorfh fkh xvd l frorul1 prowr vlploh d txdqwr jl idwwr pd frq o*djjlxqwd gl qxryl frpdqgl1 Vl xvd sulpd fxuvhv1vwduwbfroru+, shu gluh do vlvwhpd fkh yrjoldpr xvduh l frorul qho qrvwur surjudppd1 Txlqgl dvvhjqldpr od frssld gl frorul shu lo whvwr h or virqgr1 Srvvldpr dvvhjqduh sl frsslh h vfhjolhuh txdoh xvduh gl yrowd lq yrowd1 O*dvvhjqd}lrqh dyylhqh wudplwh od ixq}lrqh fxuvhv1lqlwbsdlu1 Od vlqwdvvl =

curses.init_pair([pairnumber] ,[foreground color],[background color])

L frorul vrqr lpsrvwdwl xvdqgr %fxuvhv1FRORUb% frq lo froruh ghvlghudwr1 Shu hvhpslr/ fxuvhv1FRORUbEOXH r fxuvhv1FRORUbJUHHQ1 L srvvlelol ydorul vrqr eodfn/ uhg/ juhhq/ |hoorz/ eoxh/ pdjhqwd/ f|dq h zklwh1 Edvwd djjlxqjhuh lq pdlxvfror lo qrph gho froruh d %fxuvhv1FRORUb%1 Xqd yrowd ghilqlwh oh qrvwuh frsslh gl frorul/ srvvldpr xvduoh frph sdudphwur ilqdoh ghood ixq}lrqh vfuhhq1dggvwu frph qhood vhjxhqwh uljd=
myscreen.addstr([row],[column ],[text],curses.color_pair(X) )

Txl [ udssuhvhqwd lo vhw gl frorul fkh yrjoldpr xvduh1 Vdoydwh lo vhjxhqwh frglfh +lq dowr d ghvwud, frph froruwhvw41s| txlqgl hvhjxlwhor1 Qrq fhufdwh gl hvhjxluh xq surjudppd fxuvhv lq xqd LGH frph VSH r Gu1 S|wkrq1 Hvhjxlwhor lq xq whuplqdoh1 Fl fkh gryuhvwh yhghuh xqr ixoo flufoh pdjd}lqh &73

virqgr juljlr frq wuh uljkh gl whvwr uhfdqwl od vfulwwd %Wklv lv d whvw% lq frorul gliihuhqwl1 Lo sulpr gryuheeh hvvhuh qhur0vx0yhugh/ lo vhfrqgr eox0vx0eldqfr h lo whu}r pdjhqwd vxoor virqgr juljlr1 Ulfrugdwh od frssld Wu|2Ilqdoo|1 Lo vxr xwlol}}r fl shuphwwh gl ulsulvwlqduh lo whuplqdoh do vxr vwdwr qrupdoh vh txdofrvd gl vedjoldwr vl gryhvvh yhulilfduh1 Lq dowhuqdwlyd srvvleloh xvduh lo frpdqgr fxuvhv ;

fkldpdwr zudsshu1 Zudsshu hvhjxh lo odyrur do srvwr yrvwur1 Hvhjxh fxuvhv1lqlwvfu+,/ fxuvhv1vwduwbfroru+, h fxuvhv1hqgzlq+, frv gd qrq gryhuor iduh yrl vwhvvl1 Yl gryhwh vror ulfrugduh gl ulfkldpduh fxuvhv1zudsshu qhood yrvwud ixq}lrqh pdlq1 Txhvwd uhvwlwxlvfh xq sxqwdwruh door vfkhupr1 Qhood sdjlqd vhjxhqwh +lq dowr d ghvwud, f* or vwhvvr surjudppd dsshqd fuhdwr pd frq od ixq}lrqh fxuvhv1zudsshu1
lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 47


Frph yhghwh prowr sl vhpsolfh h qrq deeldpr elvrjqr gl fkldpduh fxuvhv1hqgzlq+, vh vl yhulilfd txdofkh huuruh1 Ylhqh idwwr wxwwr do srvwr qrvwur1 Rud fkh deeldpr xqd lqidulqdwxud ghooh edvl/ phwwldpr d iuxwwr txhoor fkh deeldpr lpsdudwr qhoo*xowlpr dqqr gl odyrur h fuhldpr xq jlrfr1 Sulpd gl lql}lduh/ ghilqldpr txhoor fkh dqguhpr d iduh1 Lo qrvwur jlrfr suhqghu xqd ohwwhud pdlxvfrod txdoxqtxh h od pxryhu gdo odwr ghvwur do vlqlvwur ghoor vfkhupr1 D xqd srvl}lrqh fdvxdoh txhvwd fdpelhu gluh}lrqh gluljhqgrvl yhuvr lo edvvr1 Qrl dyuhpr xq %fdqqrqh% fkh srwu hvvhuh prvvr wudplwh l wdvwl iuhffld ghvwud h vlqlvwud frv gd srvl}lrqduor vrwwr od ohwwhud lq fdgxwd1 Txlqgl suhphqgr od eduud vsd}lr srwuhpr vsduduh1 Vh frosluhpr od ohwwhud sulpd fkh txhvwd udjjlxqjd lo qrvwur fdqqrqh uhdol}}huhpr xq sxqwr1 Dowulphqwl lo qrvwur fdqqrqh hvsorghu1 Vh shugldpr wuh fdqqrql lo jlrfr ilqlu1 Dqfkh vh sx vhpeuduh xq jlrfr vhpsolfh lq uhdow f* sduhffklr frglfh gd vfulyhuh1 Lql}ldpr1 Greeldpr suhsduduh lo qrvwur odyrur h fuhduh dofxqh ixq}lrql sulpd gl surfhghuh xowhulruphqwh1 Fuhldpr xq qxryr surjhwwr h fkldpldpror jdph41s|1 Lql}ldpr frq lo frglfh prvwudwr lq edvvr d ghvwud= Txhvwr frglfh do prphqwr qrq id judqfk/ pd lo qrvwur sxqwr gl lql}lr1 Qrwdwh fkh deeldpr txdwwur lvwux}lrql lqlwbsdlu shu ghilqluh l frorul fkh xvhuhpr frph qrvwul vhw fdvxdol h xqr shu oh hvsorvlrql +qxphur 8,1 Rud greeldpr lpsrvwduh dofxqh yduldelol h frvwdqwl fkh xvhuhpr gxudqwh lo jlrfr1 Oh lqvhuluhpr qhood urxwlqh bblqlwbb ghood fodvvh Jdph41 Vrvwlwxlwh o*lvwux}lrqh sdvv lq bblqlwbb frq lo frglfh ghood sdjlqd vhjxhqwh1 Gryuhvwh hvvhuh lq judgr gl fdsluh frvd dffdgh lq txhvwh ghilql}lrql1 Vh do prphqwr gryhvvhur vrujhuh gxeel/ wxwwr gryuheeh glyhqwduh fkldur sl dydqwl1 Vldpr ylflql dg rwwhqhuh txdofrvd gl hvhjxleloh1 Pdqfdqr dqfrud srfkh urxwlqh1 Odyruldpr vxood ixq}lrqh fkh pxryh xqd ohwwhud gd ghvwud d vlqlvwud vxoor vfkhupr= kwws=22ixooflufohpdjd}lqh1sdvwhelq1f rp2}8FjPDjp ixoo flufoh pdjd}lqh &73
import curses def main(stdscreen): curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_GREEN) curses.init_pair(2, curses.COLOR_BLUE, curses.COLOR_WHITE) curses.init_pair(3, curses.COLOR_MAGENTA,curses.COLOR_BLACK) stdscreen.clear() stdscreen.addstr(3,1," This is a test ",curses.color_pair(1)) stdscreen.addstr(4,1," This is a test ",curses.color_pair(2)) stdscreen.addstr(5,1," This is a test ",curses.color_pair(3)) stdscreen.refresh() stdscreen.getch() curses.wrapper(main)

import curses import random class Game1(): def __init__(self): pass def main(self,stdscr): curses.init_pair(1, curses.COLOR_GREEN) curses.init_pair(2, curses.COLOR_BLACK) curses.init_pair(3, curses.COLOR_BLUE) curses.init_pair(4, curses.COLOR_BLUE) curses.init_pair(5, curses.COLOR_RED)

curses.COLOR_BLACK, curses.COLOR_BLUE, curses.COLOR_YELLOW, curses.COLOR_GREEN, curses.COLOR_BLACK,

def StartUp(self): curses.wrapper(self.main) g = Game1() g.StartUp()

<

lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 47


Txhvwd od urxwlqh sl frusrvd ghoo*lqwhur surjudppd/ h d vxd yrowd lqwurgxfh qxryh ixq}lrql1 vfuq1ghofk+, fdqfhood lo fdudwwhuh d xqd gdwd uljd2frorqqd1 fxuvhv1qdspv+, glfh d s|wkrq gl ihupduvl shu [ ploolvhfrqgl +pv,1 Od orjlfd ghood urxwlqh vl wuryd +lq svhxgrfrglfh, qhood sdjlqd vhjxhqwh +lq dowr d ghvwud,1 Rud gryuhvwh hvvhuh lq judgr gl vhjxluh lo frglfh1 Deeldpr elvrjqr gl gxh qxryh urxwlqh shu jdudqwluh fkh wxwwr vld fruuhwwr1 Od sulpd H{sorgh/ lq fxl lqvhuluhpr od gluhwwlyd sdvv1 Od vhfrqgd UhvhwIruQhz1 Txl ulsulvwlqhuhpr od uljd fruuhqwh shu od ohwwhud dood uljd suhghilqlwd/ od frorqqd fruuhqwh/ lpsrvwhuhpr GursslqjOhwwhu d 3/ suhqghuhpr xqd ohwwhud h xq sxqwr gl fdgxwd fdvxdol1 Qhood sdjlqd fkh vhjxh/ do fhqwur d ghvwud vrqr suhvhqwdwh oh gxh ixq}lrql1 Deeldpr rud elvrjqr gl dowuh txdwwur ixq}lrql shu pdqwhqhuh lo wxwwr +sdjlqd vhjxhqwh/ lq edvvr d ghvwud,1 Xqd shu od ohwwhud fdvxdoh/ xq*dowud shu lo sxqwr gl fdgxwd1 Ulfrugdwh fkh deeldpr glvfxvvr yhorfhphqwh lo prgxor udqgrp doo*lql}lr ghood vhulh1
# Line Specific Stuff self.GunLine = 22 self.GunPosition = 39 self.LetterLine = 2 self.ScoreLine = 1 self.ScorePosition = 50 self.LivesPosition = 65 #Row where our gun lives #Where the gun starts on GunLine #Where our letter runs right to left #Where we are going to display the score #Where the score column is #Where the lives column is

# Letter Specific Stuff self.CurrentLetter = "A" #A dummy Holder Variable self.CurrentLetterPosition = 78 #Where the letter will start on the LetterLine self.DropPosition = 10 #A dummy Holder Variable self.DroppingLetter = 0 #Flag - Is the letter dropping? self.CurrentLetterLine = 3 #A dummy Holder Variable self.LetterWaitCount = 15 #How many times should we loop before actually working? # Bullet Specific Stuff self.Shooting = 0 #Flag - Is the gun shooting? self.BulletRow = self.GunLine - 1 self.BulletColumn = self.GunPosition # Other Stuff self.LoopCount = 0 self.GameScore = 0 self.Lives = 3 self.CurrentColor = 1 self.DecScoreOnMiss = 0 #How many loops have we done in MoveLetter #Current Game Score #Default number of lives #A dummy Holder Variable #Set to 1 if you want to decrement the #score every time the letter hits the #bottom row

Lq SlfnDOhwwhu jhqhuldpr xq lqwhur fdvxdoh wud 98 h <3 +gd %D% d %]%,1 Vh ulfrugdwh/ txdqgr vl xvd od ixq}lrqh udqgrp elvrjqd iruqluh xq ydoruh plqlpr h xqr pdvvlpr1 Vwhvvd frvd shu SlfnGursSrlqw1 Hvhjxldpr dqfkh xqd fkldpdwd d udqgrp1vhhg+, lq hqwudpeh oh ixoo flufoh pdjd}lqh &73

urxwlqh fkh dvvhjqd do jhqhudwruh fdvxdoh xq qxphur glyhuvr dg rjql fkldpdwd1 Od txduwd ixq}lrqh FkhfnNh|v1 Txhvwd vl rffxsd gl frqwurooduh l wdvwl suhpxwl gdoo*xwhqwh h wudgxuol lq prylphqwl gho fdqqrqh1 Frpxqtxh shu lo prphqwr qrq od frpsohwhuhpr/ or iduhpr sl wdugl1 Deeldpr elvrjqr 43

dqfkh ghood ixq}lrqh FkhfnIruKlw/ dqfkh txhvwd vror glfkldudwd1


def CheckKeys(self,scrn,keyin): pass def CheckForHit(self,scrn): pass

Rud fuhhuhpr xqd euhyh


lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 47


ixq}lrqh fkh vdu lo %fhuyhoor% gho qrvwur jlrfr1 Od fkldphuhpr JdphOrrs +sdjlqd vhjxhqwh/ lq dowr d ghvwud,1 Od orjlfd fkh vwd glhwur vl edvd qhoo*lpsrvwduh od qrvwud wdvwlhud vx qrghod|+4,1 Txhvwr vljqlilfd fkh qrq dwwhqghuhpr fkh xq wdvwr yhqjd suhpxwr h txdqgr dffdgh or uhjlvwuldpr shu xq xwlol}}r vxffhvvlyr1 Txlqgl hqwuldpr lq xq flfor zkloh iru}dwr d hvvhuh vhpsuh yhur +4, frvlffk lo jlrfr ydgd dydqwl ilqfk qrq vldpr surqwl d vphwwhuh1 Phwwldpr lq sdxvd shu 73 ploolvhfrqgl txlqgl pxryldpr od qrvwud ohwwhud h frqwurooldpr vh o*xwhqwh kd suhpxwr xq wdvwr1 Vh xqd %T% +qrwdwh fkh lq pdlxvfror, r lo wdvwr HVF doorud lqwhuurpsldpr lo flfor h whuplqldpr lo surjudppd1 Dowulphqwl frqwurooldpr vh vl wudwwd gho wdvwr iuhffld ghvwud r vlqlvwud r od eduud vsd}lr1 Vxffhvvlydphqwh srvvleloh uhqghuh lo jlrfr sl frpsohvvr frqiurqwdqgr lo wdvwr suhpxwr frq lo fdudwwhuh fruuhqwh h txlqgl vsduduh vror vh o*xwhqwh kd suhpxwr or vwhvvr wdvwr/ frph xq surjudppd shu pljolruduh od gdwwlorjudild1 Ulfrugdwhyl gl ulpxryhuh %T% frph wdvwr gl fklxvxud1 Deeldpr dqfkh elvrjqr gl xqd ixoo flufoh pdjd}lqh &73 44
IF we have waited the correct number of loops THEN Reset the loop counter IF we are moving to the left of the screen THEN Delete the character at the the current row,column. Sleep for 50 milliseconds IF the current column is greater than 2 THEN Decrement the current column Set the character at the current row,column IF the current column is at the random column to drop to the bottom THEN Set the DroppingLetter flag to 1 ELSE Delete the character at the current row,column Sleep for 50 milliseconds IF the current row is less than the line the gun is on THEN Increment the current row Set the character at the current row,column ELSE IF Explode (which includes decrementing the score if you wish) and check to see if we continue. Pick a new letter and position and start everything over again. ELSE Increment the loopcounter Refresh the screen.

ixq}lrqh fkh lpsrvwl fldvfxqd qxryd sduwlwd1 Od fkldpldpr QhzJdph +sdjlqd vhjxhqwh/ do fhqwur d ghvwud,1 Qhfhvvlwldpr dqfkh ghood urxwlqh SulqwVfruh fkh prvwud lo sxqwhjjlr fruuhqwh h lo qxphur gl ylwh uhvwdqwl +sdjlqd vhjxhqwh/ lq edvvr d ghvwud,1 Rud greeldpr vror djjlxqjhuh xq sr* gl frglfh +sdjlqd vhjxhqwh/ lq edvvr d vlqlvwud, dood qrvwud ixq}lrqh

def Explode(self,scrn): pass def ResetForNew(self): self.CurrentLetterLine = self.LetterLine self.CurrentLetterPosition = 78 self.DroppingLetter = 0 self.PickALetter() self.PickDropPoint() def PickALetter(self): random.seed() char = random.randint(65,90) self.CurrentLetter = chr(char) def PickDropPoint(self): random.seed() self.DropPosition = random.randint(3,78)
lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 47


pdlq shu lql}lduh lo flfor1 Dowur frglfh lq edvvr1 Djjlxqjhwhor vrwwr o*xowlpd fkldpdwd d lqlwbsdlu1 Rud gryuhppr dyhuh xq surjudppd fkh id txdofrvd1 Surydwhor1 Lr dvshwwr1 Lo surjudppd suhqgh xqd ohwwhud pdlxvfrod fdvxdoh/ od pxryh gd ghvwud d vlqlvwud ghoor vfkhupr shu xq qxphur fdvxdoh gl frorqqh txlqgl od pxryh yhuvr lo edvvr1 Frpxqtxh xqd frvd fkh qrwhuhwh h fkh dg rjql dyylr gho surjudppd od sulpd ohwwhud vhpsuh xqd %D% h lo sxqwr gl fdgxwd vhpsuh od frorqqd 431 Txhvwr shu yld ghl ydorul suhghilqlwl lq bblqlwbb1 Shu ulvroyhuh fkldpdwh vhoi1UhvhwIruQhz sulpd gl hqwuduh qho flfor zkloh qhood ixq}lrqh Pdlq1 D txhvwr sxqwr greeldpr odyruduh vxo qrvwur %fdqqrqh% h oh urxwlqh gl vxssruwr1 Djjlxqjhwh lo frglfh +sdjlqd vhjxhqwh/ lq dowr d ghvwud, dood fodvvh Jdph41 Pryhjxq vl rffxsd gl pxryhuh lo fdqqrqh lq txdoxqtxh gluh}lrqh vl yrjold1 O*xqlfd vh}lrqh qxryd lq txhvwd urxwlqh od ixq}lrqh dggfk1 Fkldpldpr frorusdlu +5, shu ghilqluh lo froruh h/ door vwhvvr whpsr/ iru}ldpr lo fdqqrqh dg dyhuh o*dwwulexwr judvvhwwr1 Xvldpr o*rshudwruh gl elwzlvh RU +%%, shu
def GameLoop(self,scrn): test = 1 #Set the loop while test == 1: curses.napms(20) self.MoveLetter(scrn) keyin = scrn.getch(self.ScoreLine,self.ScorePosition) if keyin == ord('Q') or keyin == 27: or <Esc> break else: self.CheckKeys(scrn,keyin) self.PrintScore(scrn) if self.Lives == 0: break curses.flushinp() scrn.clear()

# 'Q'

def NewGame(self,scrn): self.GunChar = curses.ACS_SSBS scrn.addch(self.GunLine,self.GunPosition,self.GunChar,cu rses.color_pair(2) | curses.A_BOLD) scrn.nodelay(1) #Don't wait for a keystroke...just cache it. self.ResetForNew() self.GameScore = 0 self.Lives = 3 self.PrintScore(scrn) scrn.move(self.ScoreLine,self.ScorePosition)

stdscr.addstr(11,28,"Welcome to Letter Attack") stdscr.addstr(13,28,"Press a key to begin....") stdscr.getch() stdscr.clear() PlayLoop = 1 while PlayLoop == 1: self.NewGame(stdscr) self.GameLoop(stdscr) stdscr.nodelay(0) curses.flushinp() stdscr.addstr(12,35,"Game Over") stdscr.addstr(14,23,"Do you want to play again? (Y/N)") keyin = stdscr.getch(14,56) if keyin == ord("N") or keyin == ord("n"): break else: stdscr.clear()

def PrintScore(self,scrn): scrn.addstr(self.ScoreLine,self.ScorePosition,"SCORE: %d" % self.GameScore) scrn.addstr(self.ScoreLine,self.LivesPosition,"LIVES: %d" % self.Lives)

ixoo flufoh pdjd}lqh &73

45

lqglfh a

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 47


iru}duh o*dwwulexwr d yhur1 Txlqgl greeldpr gduh frusr dood urxwlqh FkhfnNh|v1 Vrvwlwxlwh o*lvwux}lrqh sdvv frq lo qxryr frglfh +sdjlqd vhjxhqwh/ lq edvvr d ghvwud,1 Rud deeldpr elvrjqr gl xqd urxwlqh shu pxryhuh lo surlhwwloh yhuvr o*dowr +lq edvvr d vlqlvwud,1 Deeldpr dqfrud elvrjqr gl dowuh ixq}lrql +sdjlqd vhjxhqwh/ lq dowr d ghvwud, sulpd gl ilqluh1 Hffr lo frglfh shu frpsohwduh od ixq}lrqh FkhfnIruKlw h lo frglfh shu H{sorghExoohw1 Shu ilqluh/ frpsohwldpr H{sorgh1 Vrvwlwxldpr sdvv frq lo vhjxhqwh frglfh +survvlpd sdjlqd/ lq edvvr,1 Deeldpr ilqdophqwh xq surjudppd ixq}lrqdqwh1 Srwhwh shuvrqdol}}duh lo ydoruh lq OhwwhuZdlwFrxqw shu yhorfl}}duh r udoohqwduh lo prylphqwr ghood ohwwhud vxoor vfkhupr shu uhqghuor sl gliilfloh r idfloh1 Srwhwh dqfkh xvduh od yduldeloh FxuuhqwFroru shu vfhjolhuh fdvxdophqwh xqr ghl txdwwr frorul gd dvvhjqduh dood ohwwhud1 Yl odqflr txhvwd vilgd1 Vshur fkh yl vldwh glyhuwlwl txhvwd yrowd h fkh djjlxqjhuhwh dowur frglfh shu uhqghuh lo jlrfr sl glyhuwhqwh1 Frph do vrolwr/ o*lqwhur surjhwwr glvsrqleloh suhvvr zzz1wkhghvljqdwhgjhhn1frp r doo*lqglul}}r kwws=22ixooflufohpdjd}lqh1sdvwhelq1f rp2GhUhhk;p

def MoveGun(self,scrn,direction): scrn.addch(self.GunLine,self.GunPosition," ") if direction == 0: # left if self.GunPosition > 0: self.GunPosition -= 1 elif direction == 1: # right if self.GunPosition < 79: self.GunPosition += 1 scrn.addch(self.GunLine,self.GunPosition,self.GunChar,cur ses.color_pair(2) | curses.A_BOLD)

if keyin == 260: # left arrow - NOT on keypad self.MoveGun(scrn,0) curses.flushinp() #Flush out the input buffer for safety. elif keyin == 261: # right arrow - NOT on keypad self.MoveGun(scrn,1) curses.flushinp() #Flush out the input buffer for safety. elif keyin == 52: # left arrow ON keypad self.MoveGun(scrn,0) curses.flushinp() #Flush out the input buffer for safety. elif keyin == 54: # right arrow ON keypad self.MoveGun(scrn,1) curses.flushinp() #Flush out the input buffer for safety. elif keyin == 32: #space if self.Shooting == 0: self.Shooting = 1 self.BulletColumn = self.GunPosition scrn.addch(self.BulletRow,self.BulletColumn,"|") curses.flushinp() #Flush out the input buffer for safety. def MoveBullet(self,scrn): scrn.addch(self.BulletRow,self.BulletColumn," ") if self.BulletRow > self.LetterLine: self.CheckForHit(scrn) self.BulletRow -= 1
Juhj Zdowhuv lo sursulhwdulr ghood Udlq|Gd| Vroxwlrqv/ OOF/ xqd vrflhw gl frqvxohq}d lq Dxurud/ Frorudgr h surjudppd gdo 4<:51 Dpd fxflqduh/ iduh hvfxuvlrql/ dvfrowduh pxvlfd h sdvvduh lo whpsr frq od vxd idpljold1

scrn.addch(self.BulletRow,self.BulletColumn,"|") else: self.CheckForHit(scrn) scrn.addch(self.BulletRow,self.BulletColumn," ") self.BulletRow = self.GunLine - 1 self.Shooting = 0

ixoo flufoh pdjd}lqh &73

46

lqglfh a

SURJUDP LQ S\WKRQ 0 SDUW 47


def CheckForHit(self,scrn): if self.Shooting == 1: if self.BulletRow == self.CurrentLetterLine: if self.BulletColumn == self.CurrentLetterPosition: scrn.addch(self.BulletRow,self.BulletColumn," ") self.ExplodeBullet(scrn) self.GameScore +=1 self.ResetForNew() def ExplodeBullet(self,scrn): scrn.addch(self.BulletRow,self.BulletColumn,"X",curses.color_pair(5)) scrn.refresh() curses.napms(200) scrn.addch(self.BulletRow,self.BulletColumn,"|",curses.color_pair(5)) scrn.refresh() curses.napms(200) scrn.addch(self.BulletRow,self.BulletColumn,"-",curses.color_pair(5)) scrn.refresh() curses.napms(200) scrn.addch(self.BulletRow,self.BulletColumn,".",curses.color_pair(5)) scrn.refresh() curses.napms(200) scrn.addch(self.BulletRow,self.BulletColumn," ",curses.color_pair(5)) scrn.refresh() curses.napms(200) scrn.addch(self.CurrentLetterLine,self.CurrentLetterPosition,"X",curses.color_pair(5)) curses.napms(100) scrn.refresh() scrn.addch(self.CurrentLetterLine,self.CurrentLetterPosition,"|",curses.color_pair(5)) curses.napms(100) scrn.refresh() scrn.addch(self.CurrentLetterLine,self.CurrentLetterPosition,"-",curses.color_pair(5)) curses.napms(100) scrn.refresh() scrn.addch(self.CurrentLetterLine,self.CurrentLetterPosition,".",curses.color_pair(5)) curses.napms(100) scrn.refresh() scrn.addch(self.CurrentLetterLine,self.CurrentLetterPosition," ") scrn.addch(self.GunLine,self.GunPosition,self.GunChar,curses.color_pair(2) | curses.A_BOLD) scrn.refresh()

ixoo flufoh pdjd}lqh &73

47

lqglfh a

Vfulwwr gd Juhj Zdowhuv

KRZ0WR

Surjudppduh lq S|wkrq 0 Sduwh 48


#This is the Import import pygame from pygame.locals import * import os # This will make our game window centered in the screen os.environ['SDL_VIDEO_CENTERED'] = '1' # Initialize pygame pygame.init() #setup the screen screen = pygame.display.set_mode((800, 600)) # Set the caption (title bar of the window) pygame.display.set_caption('Pygame Test #1') # display the screen and wait for an event doloop = 1 while doloop: if pygame.event.wait().type in (KEYDOWN, MOUSEBUTTONDOWN): break

xhvwr phvh dqguhpr dg hvsoruduh S|jdph/ xq vhw gl prgxol surjhwwdwr shu vfulyhuh jlrfkl1 lo vlwr zhe kwws=22zzz1s|jdph1ruj21 Xqd flwd}lrqh gdo iloh uhdgph gl S|jdph= %S|jdph xqd oleuhuld pxowl0 sldwwdirupd surjhwwdwd shu uhqghuh idfloh od vfulwwxud gl vriwzduh pxowlphgldol/ frph l jlrfkl/ lq S|wkrq1 S|jdph ulfklhgh lo olqjxdjjlr S|wkrq h od oleuhuld pxowlphgldoh VGO1 Sx dqfkh iduh xvr gl dowuh glyhuvh oleuhulh prowr qrwh1% Vl sx lqvwdooduh S|jdph dwwudyhuvr V|qdswlf frph *s|wkrq0 jdph*1 Idwhor rud lq prgr fkh srvvldpr dqgduh dydqwl1 Lq sulpr oxrjr lpsruwldpr S|jdph +yhgl vrsud d ghvwud,1 Vxffhvvlydphqwh lpsrvwhuhpr rv1hqylurq shu idu v fkh od qrvwud ilqhvwud vld fhqwudwd vxo qrvwur vfkhupr1 Grsr gl fkh lql}ldol}}huhpr S|jdph/ srl lpsrvwhuhpr od ilqhvwud S|jdph d ;33{933 sl{ho h srl od glgdvfdold1 Lqilqh ylvxdol}}huhpr od vfkhupdwd h dqguhpr lq xq orrs gl dwwhvd ghood suhvvlrqh gl xq wdvwr vxood wdvwlhud r gl xq sxovdqwh gho prxvh1 Or vfkhupr xq rjjhwwr fkh frqwlhqh txdoxqtxh frvd ghflgldpr gl

lqilodufl1 fkldpdwr vxshuilflh1 Shqvdwh frph vh irvvh xq sh}}r gl fduwd vx fxl glvhjqhuhpr oh frvh1 Qrq prowr hfflwdqwh/ pd jl xq lql}lr1 Uhqgldpror xq sr* phqr qrlrvr1 Srvvldpr fdpelduh lo froruh ghoor virqgr frq xq txdofrvd gl phqr vfxur1 Kr wurydwr xq surjudppd gl qrph %froruqdph% fkh srwhwh lqvwdooduh wudplwh Xexqwx Vriwzduh Fhqwhu1 Txhvwr yl shuphwwh gl xvduh od %uxrwd ghl frorul% shu suhqghuh lo froruh fkh yl sldfh h yl gdu l ydorul UJE ryyhur Uhg/ Juhhq/ Eoxh gl txho froruh1 Greeldpr xvduh l frorul UJE vh qrq yrjoldpr xvduh l frorul suhghilqlwl fkh S|jdph fl riiuh1 Vl wudwwd gl xq surjudppd dffxudwr gl fxl vl gryuheeh suhqghuh lq frqvlghud}lrqh o*lqvwdood}lrqh1 Vxelwr grsr oh glfkldud}lrql g*lpsruwd}lrqh djjlxqjhwh111
Background = 208, 202, 104

Lo phwrgr vfuhhq1iloo+, lpsrvwhu lo froruh d wxwwr fl vx fxl sdvvldpr vrsud1 Od olqhd vxffhvvlyd/ s|jdph1glvsod|1xsgdwh+,/ lq uhdow djjlruqd l fdpeldphqwl dl qrvwul vfkhupl1 Vdoydwh txhvwr frq lo qrph gl s|jdph41s| h dqgldpr dydqwl1 Rud prvwuhuhpr dofxql whvwl vxo qrvwur prghvwr vfkhupr1 Qxrydphqwh lql}ldpr frq o*lpsruwduh oh qrvwul glfkldud}lrql h od yduldeloh gl dvvhjqd}lrqh gl edfnjurxqg gho qrvwur xowlpr surjudppd1 ;

import pygame from pygame.locals import * import os Background = 208, 202, 104

Rud/ djjlxqjhwh xqd yduldeloh djjlxqwlyd shu lo froruh gl sulpr sldqr ghood qrvwud irqw1
FontForeground = 255,255,255 # White

Txhvwr lpsrvwhu od yduldeloh Edfnjurxqg vx xq froruh grudwr1 Vxffhvvlydphqwh grsr od olqhd s|jdph1glvsod|1vhwbfdswlrq/ djjlxqjhwh oh vhjxhqwl olqhh111
screen.fill(Background) pygame.display.update()

Txlqgl djjlxqjhuhpr qhood pdjjlru sduwh gho frglfh gdo qrvwur xowlpr surjudppd +prvwudwr d ghvwud,1
frqwhqwv a

ixoo flufoh pdjd}lqh &74

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 48


Vh or vl hvhjxh dghvvr qrq fdpeldwr qlhqwh ylvlydphqwh gdo prphqwr fkh deeldpr djjlxqwr od ghilql}lrqh lq sulpr sldqr 1 Rud grsr od olqhd vfuhhq1iloo+, h sulpd gho orrs gho qrvwur frglfh/ lqvhulwh oh vhjxhqwl olqhh= fkh ghvlghuldpr prvwuduh vh yrjoldpr xvduh o*dqwl0doldvlqj +Yhur lq txhvwr fdvr,/ lo froruh gho fdudwwhuh lq sulpr sldqr h lqilqh lo froruh gho fdudwwhuh gl virqgr1
# This will make our game window centered in the screen os.environ['SDL_VIDEO_CENTERED'] = '1' # Initialize pygame pygame.init() # Setup the screen screen = pygame.display.set_mode((800, 600)) # Set the caption (title bar of the window) pygame.display.set_caption('Pygame Test #1') screen.fill(Background) pygame.display.update() # Our Loop doloop = 1 while doloop: if pygame.event.wait().type in (KEYDOWN, MOUSEBUTTONDOWN): break

Od olqhd vxffhvvlyd +wh{w1jhwbuhfw+,, dvvhjqd xq rjjhwwr uhwwdqjroduh fkh font = xvhuhpr shu lqvhuluh lo whvwr vxoor pygame.font.Font(None,27) text vfkhupr1 Txhvwd xqd frvd = font.render('Here is some lpsruwdqwh gdo prphqwr fkh txdvl text', True, FontForeground, Background) textrect = wxwwr lo uhvwr gl fxl fl rffxshuhpr text.get_rect() frq l uhwwdqjrol +fdsluhwh gl sl lq xq screen.blit(text,textrect) vhfrqgr prphqwr,1 Srl pxryldpr pygame.display.update() +eolw, lo uhwwdqjror vxoor vfkhupr1 H ilqdophqwh djjlruqldpr or vfkhupr Dqgdwh dydqwl/ vdoydwh lo shu idu prvwuduh lo qrvwur whvwr1 Frvd surjudppd frq lo qrph gl yxro gluh %eolw% h shufk gldplqh s|jdph51s| hg hvhjxlwhor1 Qhoor Vfkhupr lq dowr d vlqlvwud vl gryuheeh gryuhl iduh txdofrvd fkh vxrqd frv vwudqrB Lo whuplqh ulvdoh djol dqql *:3 h yhghuh lo whvwr Khuh lv vrph wh{w1 yhqlyd gd [hur{ SDUF +gd fxl Dqgldpr d vfulyhuh dofxql frpdqgl1 surylhqh prowd ghood whfqrorjld rglhuqd,1 Lo whuplqh ruljlqdoh hud Lq sulpr oxrjr fkldpldpr lo phwrgr Irqw h or sdvvldpr d gxh dujrphqwl1 Lo ElwEOW fkh vljqlilfd Elw +ru Elwpds, Eorfn Wudqvihu1 Srl yhqqh fdpeldwr lq sulpr lo qrph ghood irqw fkh Eolw +iruvh shufk sl fruwr,1 ghvlghuldpr xvduh h lo vhfrqgr od Sudwlfdphqwh vwldpr pxryhqgr od glphqvlrqh ghood irqw1 Lq txhvwr prphqwr fl olplwhuhpr d xvduh *Qrqh* qrvwud lppdjlqh r lo qrvwur whvwr h odvflduh fkh lo vlvwhpd vfhojd xq wlsr vxoor vfkhupr1 gl fdudwwhuh shu qrl h lpsrvwldpr od Fkh iduh vh yrjoldpr fkh lo whvwr glphqvlrqh gho fdudwwhuh d 5: sxqwl1 yhqjd fhqwudwr vxoor vfkhupr lqyhfh fkh vxood uljd lq dowr gryh fl yxroh xq Grsr deeldpr lo phwrgr sr* gl whpsr shu yhghuorB Wud od olqhd irqw1uhqghu+,1 Txhvwr kd txdwwur wh{w1jhwbuhfw+, h vfuhhq1eolw lqvhulwh oh dujrphqwl1 Lq ruglqh fl vrqr= l whvwl ixoo flufoh pdjd}lqh &74

vhjxhqwl gxh olqhh=


textRect.centerx = screen.get_rect().centerx textRect.centery = screen.get_rect().centery

irqw1vhwblwdolf+Wuxh, d ghvwud grsr od olqhd s|jdph1irqw1Irqw1 Ulfrugdwh/ deeldpr glvfxvvr euhyhphqwh vxoo*lpsrvwd}lrqh *Qrqh* txdqgr lpsrvwldpr lo wlsr gl fdudwwhuh d xq irqw jhqhulfr1 Lppdjlqldpr fkh gl yrohu xwlol}}duh xq irqw sl hoderudwr1 Frph kr ghwwr sulpd lo s|jdph1irqw1Irqw+, phwkrg kd gxh dujrphqwl1 Lo sulpr vl ulihulvfh do shufruvr h do qrph gho iloh ghood irqw fkh yruuhppr xvduh/ lo vhfrqgr id ulihulphqwr dood glphqvlrqh gho fdudwwhuh1 D txhvwr sxqwr lo sureohpd lo shufruvr1 Frph idffldpr d vdshuh lo yhur shufruvr h lo qrph gho iloh ghood irqw fkh yruuhppr xvduh lq xq txdoxqtxh vlvwhpdB Shu iruwxqd
frqwhqwv a

Dghvvr vwldpr ulohydqgr lo fhqwur ghoo*rjjhwwr vfkhupr +ulfrugdwh/ vxshuilflh, qhooh srvl}lrql lq sl{ho { h | h vwldpr lpsrvwdqgr l sxqwl fhqwudol { h | gho qrvwur rjjhwwr wh{wUhfw d txhl ydorul1 Hvhjxlwh lo surjudppd1 Rud lo qrvwur whvwr fhqwudwr qhood vxshuilflh1 Srwhwh lqrowuh prglilfduh lo whvwr xvdqgr +qho qrvwur vhpsolfh frglfh, irqw1vhwberog+Wuxh, h2r <

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 48


S|jdph kd xqd ixq}lrqh fkh fl shqvd shu qrl1 Vl fkldpd pdwfkbirqw1 Hffr txl xq surjudppd fkh prvwuhu lo shufruvr h lo qrph gho iloh ghood irqw +lq txhvwr fdvr, Frxulhu Qhz1
import pygame from pygame.locals import * import os print pygame.font.match_font('Courie r New')

shufruvr h lo qrph ghood irqw1 Fl vrqr dowul prgl shu iduh od vwhvvd frvd/ pd or odvflr fdsluh d yrl lq prgr fkh srvvldpr dqgduh dydqwl1 Vh lo whvwr ehoor/ od judilfd shu pljolruh1 Kr wurydwr xq wxwruldo yhudphqwh fdulqr shu S|jdph vfulwwr gd Sh|wrq PfFrooxjk h kr shqvdwr gl suhqghuor h prglilfduor1 Shu txhvwd sduwh deeldpr elvrjqr gl lql}lduh frq xqd iljxud fkh vl pxryhu lqwruqr od qrvwud vxshuilflh1 Txhvwd iljxud qrwd frph *vsulwh*1 Xwlol}}dwh JLPS r txdofkh dowur vwuxphqwr shu fuhduh xqd iljxud vwlol}}dwd1 Qlhqwh gl idqwdvwlfr/ vror xqd jhqhulfd iljxud vwlol}}dwd1 Vl suhvxph fkh vwldwh xvdqgr JLPS1 Fuhdwh xqd qxryd lppdjlqh/ lpsrvwdwh oh glphqvlrql gl dowh}}d h odujkh}}d d 83 sl{ho h qhooh rs}lrql dydq}dwh lpsrvwdwh lo ulhpslphqwr vx wudvsduhqwh1 Xwlol}}dwh or vwuxphqwr pdwlwd frq xq shqqhoor ulwrqgr +36,1 Glvhjqdwh od yrvwud slffrod iljxud h vdoydwhod frph vwlfn1sqj qhood vwhvvd fduwhood fkh dyhwh xvdwr shu lo frglfh1 Hffr frph dssduh txhood pld1 Vrqr vlfxur fkh yrl vdshwh iduh gl phjolr1 Or vr111 qrq vrqr xq*duwlvwd1 Wxwwdyld shu l qrvwul vfrsl edvwd1 Deeldpr vdoydwr lo iloh ixoo flufoh pdjd}lqh &74

import pygame from pygame.locals import * import os Background = 0,255,127 os.environ['SDL_VIDEO_CENTERED'] = '1' pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption('Pygame Example #4 - Sprite') screen.fill(Background)

Qho plr vlvwhpd lo ydoruh uhvwlwxlwr %2xvu2vkduh2irqwv2wuxhw|sh2pvwwfruhi rqwv2frxu1wwi%1 Vh shu lo irqw qrq ylhqh wurydwr lo ydoruh gl ulwruqr Qrqh1 Dpphwwhqgr lo fdvr fkh od irqw vwdwd wurydwd/ doorud srvvldpr dvvhjqduh d xqd yduldeloh lo ydoruh uhvwlwxlwr h gl frqvhjxhq}d srvvldpr xvduh oh vhjxhqwl dwwulex}lrql1
courier = pygame.font.match_font('Courie r New') font = pygame.font.Font(courier,27)

frph 1sqj h deeldpr lpsrvwdwr or virqgr vx wudvsduhqwh lq prgr fkh yhqjdqr prvwudwh vror oh slffroh olqhh qhuh ghood qrvwud iljxud vwlol}}dwd h qrq xqr virqgr eldqfr r gl xq dowur froruh1 Yhgldpr dghvvr frvd yrjoldpr fkh lo surjudppd idffld1 Yrjoldpr prvwuduh xqd ilqhvwud gl S|jdph frq od qrvwud iljxud vwlol}}dwd lq hvvd1 Yrjoldpr fkh od iljxud vl pxryd txdqgr suhpldpr txdoxqtxh iuhffld gluh}lrqdoh +vx/ jl/ ghvwud/ vlqlvwud, vhpsuh fkh qrq vldpr vxo erugr ghoor vfkhupr h od iljxud qrq vl srvvd pxryhuh xowhulruphqwh1 Yruuhpr xvfluh gdo jlrfr txdqgr suhpldpr lo wdvwr t1 Rud vsrvwduh or vsulwh lq jlur srwuheeh vhpeuduh idfloh h or / pd xq sr* sl gliilfloh gl txdqwr vhpeul lql}ldophqwh1 Lql}ldpr fuhdqgr gxh uhwwdqjrol1 Xqr shu or vsulwh vh vwhvvr h xqr ghooh vwhvvh glphqvlrql pd eldqfr1 Pxryldpr or vsulwh vxood 43

vxshuilflh shu lql}lduh/ srl txdqgr o*xwhqwh suhph xq wdvwr pxryldpr lo uhwwdqjror eldqfr vrsud or vsulwh ruljlqdoh/ ulohyldpr od qxryd srvl}lrqh h pxryldpr qxrydphqwh or vsulwh vxood vxshuilflh qhood qxryd srvl}lrqh1 Sl r phqr txhoor fkh deeldpr idwwr o*xowlpd yrowd frq lo jlrfr ghoo*doidehwr1 Txhvwr wxwwr shu txhvwr surjudppd1 Fl gdu xq*lghd gl frph phwwhuh hiihwwlydphqwh xq hohphqwr judilfr vxoor vfkhupr h pxryhuor1 Txlqgl lql}ldpr xq qxryr surjudppd h or fkldpldpr s|jdph71s|1 Srvl}lrqdwhor qhood fduwhood lqfoxghv fkh deeldpr xvdwr gxudqwh txhvwr wxwruldo1 Txhvwd yrowd xwlol}}huhpr xqr virqgr gl froruh yhugh phqwd/ txlqgl l ydorul gryuheehur hvvhuh 3/ 588/ 45: +yhgl vrsud,1 Vxffhvvlydphqwh fuhldpr xqd fodvvh fkh jhvwlu od qrvwud judilfd r or
frqwhqwv a

Fdpeldwh od yrvwud xowlpd yhuvlrqh gho surjudppd lqvhuhqgr txhvwh gxh olqhh h surydwh gl qxryr1 O*xowlpd olqhd glfh txhvwr= xvdwh xq fdudwwhuh fkh yrl VDSHWH hvvhuh glvsrqleloh qho frpsxwhu ghoo*xwhqwh ilqdoh rssxuh lqfoxghwhor txdqgr glvwulexlwh lo yrvwur surjudppd h frglilfdwh lo

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 48


vsulwh + prvwudwr qhood sdjlqd vxffhvvlyd lq edvvr d vlqlvwud,1 Phwwhwh txhvwr sdudphwur grsr oh lpsruwd}lrql1 Fkh frv* wxwwr txhvwr fkh vwr idfhqgrB Frplqfldpr frq od urxwlqh bblqlwbb1 Lql}ldol}}ldpr lo prgxor ghoor vsulwh gl S|jdph frq od olqhd s|jdph1vsuwh1Vsulwh1bblqlwbb1 Srl lpsrvwldpr od vxshuilflh h od fkldpldpr vfkhupr1 Txhvwr fl shuphwwhu gl frqwurooduh vh or *vsulwh* yd ixrul gdoor vfkhupr1 Vxffhvvlydphqwh fuhldpr h lpsrvwldpr od srvl}lrqh ghood yduldeloh yxrwd rogvsulwh/ fkh pdqwhuu od srvl}lrqh gho qrvwur vsulwh1 Rud fdulfkldpr od qrvwud iljxud vwlol}}dwd frq od urxwlqh s|jdph1lpdjh1ordg/ lqglfdqgroh lo qrph gho iloh +h lo shufruvr/ vh txhvwr qrq qho shufruvr gho surjudppd,1 Txlqgl dftxlvldpr xq ulihulphqwr +vhoi1uhfw, door vsulwh fkh lpsrvwl dxwrpdwlfdphqwh od odujkh}}d h o*dowh}}d gho uhwwdqjror h lpsrvwl od srvl}lrqh {/| gl txho uhwwdqjror dood srvl}lrqh fkh deeldpr sdvvdwr qhood urxwlqh1 Od urxwlqh gl djjlruqdphqwr sudwlfdphqwh fuhd xqd frsld ghoor vsulwh/ srl frqwurood vh txhvwr yd ixrul gdoor vfkhupr1 Vh frv/ ulpdqh gry*/ dowulphqwl od vxd srvl}lrqh ylhqh vsrvwdwd gl txho wdqwr fkh fkh jol deeldpr lqglfdwr1 Rud/ grsr od glfkldud}lrqh vfuhhq1iloo/ lqvhulwh lo frglfh ulsruwdwr qhood sdjlqd vhjxhqwh +odwr ghvwur,1 Txl fuhldpr xq*lvwdq}d ghood qrvwud fodvvh gl qrph %fkdudfwhu%1 Srl pxryldpr or vsulwh1 Fuhldpr or vsulwh uhwwdqjroduh yxrwr h ulhpsldpror frq lo froruh gl virqgr1 Djjlruqldpr od vxshuilflh h lql}ldpr lo qrvwur flfor1 Ilqr d txdqgr GrOrrs htxlydohqwh d 4/ hiihwwxldpr lo orrs dwwudyhuvr lo frglfh1 Xvldpr s|jdph1hyhqw1jhw+, shu dyhuh xq fdudwwhuh gdood wdvwlhud1 Srl or yhulilfkldpr d vhfrqgd gho wlsr gl hyhqwr1 Vh TXLW/ xvfldpr1 Vh xq hyhqwr NH\GRZQ gl s|jdph or hvhjxldpr1 Jxdugldpr lo ydoruh ghood fkldyh uhvwlwxlwd h od frqiurqwldpr frq oh frvwdqwl ghilqlwh gd S|jdph1 Srl fkldpldpr o*djjlruqdphqwr ghood urxwlqh qhood qrvwud fodvvh1 Qrwdwh txl fkh vwldpr vhpsolfhphqwh sdvvdqgr xqd olvwd fkh frqwlhqh l qxphul ghl sl{ho ghjol dvvl [ h \ shu pxryhuh lo shuvrqdjjlr1 Or fdpeldpr gl 43 sl{ho +srvlwlyr yhuvr ghvwud r vrwwr h qhjdwlyr yhuvr vlqlvwud r vrsud,1 Vh lo ydoruh ghood fkldyh xjxdoh d t/ lpsrvwldpr GrOrrs d 3 h xvfldpr gdo orrs1 Grsr wxwwr txhvwr pxryldpr lo shuvrqdjjlr yxrwr dood yhffkld
frqwhqwv a

class Sprite(pygame.sprite.Sprite): def __init__(self, position): pygame.sprite.Sprite.__init__(self) # Save a copy of the screen's rectangle self.screen = pygame.display.get_surface().get_rect() # Create a variable to store the previous position of the sprite self.oldsprite = (0, 0, 0, 0) self.image = pygame.image.load('stick3.png') self.rect = self.image.get_rect() self.rect.x = position[0] self.rect.y = position[1] def update(self, amount): # Make a copy of the current rectangle for use in erasing self.oldsprite = self.rect # Move the rectangle by the specified amount self.rect = self.rect.move(amount) # Check to see if we are off the screen if self.rect.x < 0: self.rect.x = 0 elif self.rect.x > (self.screen.width - self.rect.width): self.rect.x = self.screen.width - self.rect.width if self.rect.y < 0: self.rect.y = 0 elif self.rect.y > (self.screen.height - self.rect.height): self.rect.y = self.screen.height - self.rect.height

ixoo flufoh pdjd}lqh &74

44

SURJUDPPDUH LQ S\WKRQ 0 SDUWH 48


srvl}lrqh/ pxryldpr or vsulwh qhood qxryd srvl}lrqh h frph xowlpd frvd djjlruqldpr> pd lq txhvwr fdvr djjlruqldpr vror l gxh uhwwdqjrol frqwhqhqwl or vsulwh yxrwr h txhoor dwwlyr1 Txhvwr frqvhqwh gl ulvsduplduh xqd txdqwlw hqruph gl whpsr h gl hoderud}lrqh1 Frph vhpsuh o*lqwhur frglfh udjjlxqjleloh do vlwr zzz1wkhghvljqdwhgjhhn1frp r doo*lqglul}}r kwws=22ixooflufohpdjd}lqh1sdvwhelq1fr p2GyVs]edm1 Vl srvvrqr iduh prowh sl frvh frq S|jdph1 Frqvljolr gl ylvlwduh lo orur vlwr h gl jxdugduh od sdjlqd gl ulihulphqwr +kwws=22zzz1s|jdph1ruj2grfv2uhi2lq gh{1kwpo,1 Lq djjlxqwd srwhwh gduh xq*rffkldwd dl jlrfkl fkh jol dowul kdqqr fdulfdwr1 Od survvlpd yrowd vfdyhuhpr sl lq surirqglw vx S|jdph fuhdqgr xq jlrfr fkh surylhqh gdo plr sdvvdwr111 gdo plr sdvvdwr prowr ORQWDQR1
character = Sprite((screen.get_rect().x, screen.get_rect().y)) screen.blit(character.image, character.rect) # Create a Surface the size of our character blank = pygame.Surface((character.rect.width, character.rect.height)) blank.fill(Background) pygame.display.update() DoLoop = 1 while DoLoop: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # Check for movement elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: character.update([-10, 0]) elif event.key == pygame.K_UP: character.update([0, -10]) elif event.key == pygame.K_RIGHT: character.update([10, 0]) elif event.key == pygame.K_DOWN: character.update([0, 10]) elif event.key == pygame.K_q: DoLoop = 0 # Erase the old position by putting our blank Surface on it screen.blit(blank, character.oldsprite) # Draw the new position screen.blit(character.image, character.rect) # Update ONLY the modified areas of the screen pygame.display.update([character.oldsprite, character.rect])

Juhj Zdowhuv lo sursulhwdulr ghood Udlq|Gd| Vroxwlrqv/ OOF/ xqd vrflhw gl frqvxohq}d lq Dxurud/ Frorudgr h surjudppd gdo 4<:51 Dpd fxflqduh/ iduh hvfxuvlrql/ dvfrowduh pxvlfd h sdvvduh lo whpsr frq od vxd idpljold1

ixoo flufoh pdjd}lqh &74

45

frqwhqwv a

Scritto da Greg Walters

HOW0TO
Forza, iniziamo.

Programmare in Python 0 Parte 16


print ("This is a test")

empo fa promisi a qualcuno che avrei trattato le differenze tra Python 2.x e 3.x. La volta scorsa dissi che avremmo continuato la programmazione con pygame ma sento che dovrei mantenere la mia promessa cos approfondiremo di pi pygame la prossima volta. In Python 3.x sono stati fatti molti cambiamenti. Sul web c' una gran quantit di informazioni riguardo questi mutamenti e alla fine dell'articolo includer alcuni collegamenti. Vi sono anche molte preoccupazioni relativamente al fare il cambiamento. Mi concentrer sulle variazioni che riguardano le cose che avete imparato finora.

PRINT
Come ho detto prima uno degli argomenti pi importanti il modo in cui affrontiamo il comando print. Con la versione 2.x possiamo usare semplicemente:
print "This is a test"

Non un cambiamento molto grande ma qualcosa di cui dobbiamo essere consapevoli. Potete prepararvi alla migrazione utilizzando questa sintassi sotto Python 2.x.

>>> print "This is a test" File "<stdin>", line 1 print "This is a test" ^ SyntaxError: invalid syntax >>>

Formattazione e sostituzione di variabile

di formattazione '%s' e '%d' spariranno. Il nuovo modo, mostrato sotto, usare le dichiarazioni di sostituzione '{x}'. In effetti mi sembra essere pi facile da leggere. Potete anche fare cose come questa:
>>> print ("Hello {0}. I'm glad you are here at {1}.format("Fred","MySite.com ")) Hello Fred. I'm glad you are here at MySite.com >>>

e cos sar fatto. Tuttavia, con la Anche la formattazione e la 3.x, se ci proviamo otterremo il sostituzione di variabile sono messaggio di errore mostrato sopra cambiate. Con la versione 2.x a destra. abbiamo usato cose simili all'esempio mostrato sotto a Non bello. Per usare il sinistra e, con la versione 3.1, comando print dobbiamo mettere potete ottenere il giusto risultato. ci che vogliamo stampare tra Comunque ci dovuto al parentesi tonde cos: cambiamento dato che le funzioni

>>> months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] >>> print "You selected month %s" % months[3] You selected month Apr >>> VECCHIO METODO

Ricordate, potete ancora usare '%s' e cos via ma essi spariranno.

Numeri
>>> months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] >>> print("You selected month {0}".format(months[3])) You selected month Apr >>> NUOVO METODO

Sotto Python 2.x, se facevate:


x = 5/2.0

x avrebbe contenuto 2.5. Tuttavia se aveste fatto:


indice ^

full circle magazine #42

PROGRAMMARE IN PYTHON 0 PARTE 16


x = 5/2

x avrebbe contenuto 2 grazie al troncamento. Sotto la versione 3.x se fate:


x = 5/2

response = input ('Enter a selection -> ')

e funziona proprio bene.

ottenete ancora 2.5. Per troncare la divisione dovete fare:


x = 5//2

Non uguale
Sotto la versione 2.x avremmo potuto fare un test di "non uguaglianza" con "<>". Tuttavia ci non consentito nella versione 3.x. L'operatore di prova adesso "!=".

Input
Un po' di tempo fa abbiamo avuto a che fare con un sistema di men che usava raw_input() per ottenere una risposta dall'utente della nostra applicazione. Qualcosa che andava cos:
response = raw_input('Enter a selection -> ')

Convertire i programmi pi vecchi in Python 3.x

Python 3.x +======================================+ arriva con una | Item 1 3.00 | utility che aiuta a | Item 2 15.00 | convertire +--------------------------------------+ un'applicazione 2.x | Total 18.00 | in codice conforme +======================================+ Script terminated. alla versione 3.x. Non funziona sempre ma vi ci porter vicini in Quando viene eseguito sotto la molti casi. Lo strumento di conversione viene chiamato "2to3". versione 2.x, l'output simile a quello mostrato sopra a destra. Prendiamo come esempio un programma davvero semplice. Naturalmente quando lo L'esempio sotto preso da eseguiamo sotto la 3.x non Programmare in Python Parte 3 di funziona. tempo addietro.

#pprint1.py #Example of semi-useful functions def TopOrBottom(character,width): # width is total width of returned line return '%s%s%s' % ('+',(character * (width-2)),'+') def Fmt(val1,leftbit,val2,rightbit): # prints two values padded with spaces # val1 is thing to print on left, val2 is thing to print on right # leftbit is width of left portion, rightbit is width of right portion part2 = '%.2f' % val2 return '%s%s%s%s' % ('| ',val1.ljust(leftbit-2,' '),part2.rjust(rightbit-2,' '),' |') # Define the prices of each item item1 = 3.00 item2 = 15.00 # Now print everything out... print TopOrBottom('=',40) print Fmt('Item 1',30,item1,10) print Fmt('Item 2',30,item2,10) print TopOrBottom('-',40) print Fmt('Total',30,item1+item2,10) print TopOrBottom('=',40)

Questo andava bene sotto la versione 2.x. Tuttavia sotto la 3.x otteniamo:
Traceback (most recent call last): File "<Stdin>", line 1, in <module> NameError: name 'raw_input' is not definited

Questo non un grosso problema. Il metodo raw_input() stato sostituito da input(). Semplicemente, cambiate la riga in:

full circle magazine #42

indice ^

PROGRAMMARE IN PYTHON 0 PARTE 16


File "pprint1.py", line 18 print TopOrBottom('=',40) SyntaxError: invalid syntax cp pprint1.py pprint1v3.py

cambiamenti. Ci mostrato sotto a destra.

versione 2.x.

Proveremo a lasciare che l'applicazione di conversione lo sistemi per noi. Per prima cosa dovremmo creare una copia di riserva dell'applicazione che sar convertita. Io lo faccio creando una copia del file e aggiungendo un "v3" alla fine del nome:

Vi sono molteplici modi di eseguire l'applicazione. Il modo pi semplice lasciare che l'applicazione controlli il codice e ci dica dove sono i problemi, il che viene mostrato sotto a sinistra. Notate che il codice sorgente originale non cambiato. Dobbiamo usare il flag "0w" per dirgli di scrivere sul file i

Noterete anche che l'output identico. Questa volta, comunque, il versione 3.x? file sorgente (mostrato nella Molti dei problemi sono comuni pagina successiva) cambiato in un a qualunque cambiamento in un file "versione 3 compatibile". linguaggio di programmazione. I cambiamenti di sintassi abbondano Adesso il programma funziona ad ogni nuova versione. A volte come dovrebbe sotto la versione spuntano fuori dal nulla scorciatoie 3.x. E, dato che era semplice, come += o 0= e rendono la nostra funziona ancora anche sotto la
> 2to3 -w pprint1v3.py RefactoringTool: Skipping implicit fixer: buffer RefactoringTool: Skipping implicit fixer: idioms RefactoringTool: Skipping implicit fixer: set_literal RefactoringTool: Skipping implicit fixer: ws_comma RefactoringTool: Refactored pprint1v3.py --- pprint1v3.py (original) +++ pprint1v3.py (refactored) @@ -15,9 +15,9 @@ item1 = 3.00 item2 = 15.00 # Now print everything out... -print TopOrBottom('=',40) -print Fmt('Item 1',30,item1,10) -print Fmt('Item 2',30,item2,10) -print TopOrBottom('-',40) -print Fmt('Total',30,item1+item2,10) -print TopOrBottom('=',40) +print(TopOrBottom('=',40)) +print(Fmt('Item 1',30,item1,10)) +print(Fmt('Item 2',30,item2,10)) +print(TopOrBottom('-',40)) +print(Fmt('Total',30,item1+item2,10)) +print(TopOrBottom('=',40)) RefactoringTool: Files that were modified: RefactoringTool: pprint1v3.py

Passo adesso alla

> 2to3 pprint1v3.py RefactoringTool: Skipping implicit fixer: buffer RefactoringTool: Skipping implicit fixer: idioms RefactoringTool: Skipping implicit fixer: set_literal RefactoringTool: Skipping implicit fixer: ws_comma RefactoringTool: Refactored pprint1v3.py --- pprint1v3.py (original) +++ pprint1v3.py (refactored) @@ -15,9 +15,9 @@ item1 = 3.00 item2 = 15.00 # Now print everything out... -print TopOrBottom('=',40) -print Fmt('Item 1',30,item1,10) -print Fmt('Item 2',30,item2,10) -print TopOrBottom('-',40) -print Fmt('Total',30,item1+item2,10) -print TopOrBottom('=',40) +print(TopOrBottom('=',40)) +print(Fmt('Item 1',30,item1,10)) +print(Fmt('Item 2',30,item2,10)) +print(TopOrBottom('-',40)) +print(Fmt('Total',30,item1+item2,10)) +print(TopOrBottom('=',40)) RefactoringTool: Files that need to be modified: RefactoringTool: pprint1v3.py

full circle magazine #42

10

indice ^

PROGRAMMARE IN PYTHON 0 PARTE 16


vita pi facile, in effetti. Quale lo svantaggio del migrare semplicemente alla versione 3.x proprio adesso? Beh, ce n' un po'. Molti moduli di librerie che abbiamo utilizzato non sono disponibili per la versione 3 proprio adesso. Cose come Mutegen, che abbiamo utilizzato qualche articolo fa, non sono proprio ancora disponibili. Quantunque questo sia un ostacolo, non richiede che rinunciate completamente a Python 3.x. Il mio suggerimento di cominciare ora a scrivere codice utilizzando un'apposita sintassi 3.x. La versione 2.6 di Python supporta quasi tutto ci di cui avreste bisogno per scrivere in modalit 3.x. In questo modo sarete pronti a partire una volta che dovrete cambiare alla 3.x. Se riuscite a sopravvivere con la libreria di moduli standard, continuate e fate il salto. Se, d'altro canto, andate oltre i limiti potreste voler attendere fino a che la libreria dei moduli si aggiorna. E lo far. Sotto vi sono alcuni collegamenti che ho pensato potessero essere utili. Il primo alla pagina sull'impiego di 2to3. Il
#pprint1.py #Example of semi-useful functions def TopOrBottom(character,width): # width is total width of returned line return '%s%s%s' % ('+',(character * (width-2)),'+') def Fmt(val1,leftbit,val2,rightbit): # prints two values padded with spaces # val1 is thing to print on left, val2 is thing to print on right # leftbit is width of left portion, rightbit is width of right portion part2 = '%.2f' % val2 return '%s%s%s%s' % ('| ',val1.ljust(leftbit-2,' '),part2.rjust(rightbit-2,' '),' |') # Define the prices of each item item1 = 3.00 item2 = 15.00 # Now print everything out... print(TopOrBottom('=',40)) print(Fmt('Item 1',30,item1,10)) print(Fmt('Item 2',30,item2,10)) print(TopOrBottom('-',40)) print(Fmt('Total',30,item1+item2,10)) print(TopOrBottom('=',40))

secondo un bignamino di 4 pagine che ho scoperto essere un riferimento molto buono. Il terzo a ci che considero essere il miglior libro sull'utilizzo di Python (questo fino a che decider di scrivere il mio). Arrivederci alla prossima volta. Collegamenti Utilizzo di 2to3 http://docs.python.org/library/2to3 .html full circle magazine #42

Passare da Python 2 a Python 3 (un bignamino di 4 pagine) http://ptqmedia.pearsoncmq.com/i mprint_downloads/informit/promo tions/python/python2python3.pdf Dive into Python 3 http://diveintopython3.org

Greg Walters il proprietario della RainyDay Solutions, LLC, una societ di consulenza in Aurora, Colorado e programma dal 1972. Ama cucinare, fare escursioni, ascoltare musica e passare il tempo con la sua famiglia.

11

indice ^

You might also like