Sei sulla pagina 1di 43

full circle

Programozi sorozat - Klnkiads


AZ UBUNTU LINUX KZSSG FGGETLEN MAGAZINJA

Pro gra Kl moz nk i so iad roza s t

PROGRAMOZZUNK PYTHONBAN 2. Ktet

full circle magazin Python 2. ktet

A Full Circle magazin nem azonostand a Canonical Ltd.-vel

tartalom ^

Programozzunk Pythonban 9. rsz 3. oldal

Full Circle
AZ UBUNTU LINUX KZSSG FGGETLEN MAGAZINJA

A Full Circle magazin klnkiadsa

Programozzunk Pythonban 1 3. rsz 22. oldal

dvzllek egy jabb, egyetlen tmrl szl klnkiadsban


Programozzunk Pythonban 1 0. rsz 7. oldal

Vlaszul az olvask ignyeire, nhny sorozatknt megrt cikk tartalmt sszegyjtjk dediklt kiadsokba. Most ez a Programozzunk Pythonban 9.-1 6. rsznek az jabb kiadsa (a magazin 35.-42. szmaibl), semmi extra, csak a tnyek.

Programozzunk Pythonban 1 4. rsz 27. oldal

Programozzunk Pythonban 1 1 . rsz 1 2. oldal

Krlek, ne feledkezz meg az eredeti kiadsi dtumrl. A hardver s szoftver jelenlegi verzii eltrhetnek az akkor kzltektl, gy ellenrizd a hardvered s szoftvered verziit, mieltt megprblod emullni/utnozni a klnkiadsokban lv ismertetket. Elfordulhat, hogy a szoftver ksbbi verzii vannak meg neked, vagy rhetk el a kiadsod troliban.

Programozzunk Pythonban 1 5. rsz 34. oldal

Programozzunk Pythonban 1 2. rsz 1 7. oldal

J szrakozst!

Programozzunk Pythonban 1 6. rsz 39. oldal

Minden szveg- s kpanyag, amelyet a magazin tartalmaz, a Creative Commons Nevezd meg! gy add tovbb! 2.5 Magyarorszg Licenc alatt kerl kiadsra. Ez annyit jelent, hogy tdolgozhatod, msolhatod, terjesztheted s tovbbadhatod a benne tallhat cikkeket a kvetkez felttelekkel: jelezned kell eme szndkodat a szerznek (legalbb egy nv, e-mail cm vagy url elrssel) valamint fel kell tntetni a magazin nevt (full circle magazin) s az url-t, ami a www.fullcirclemagazine.org (gy terjeszd a cikkeket, hogy ne sugalmazzk azt, hogy te ksztetted ket vagy a te munkd van benne). Ha mdostasz, vagy valamit tdolgozol benne, akkor a munkd eredmnyt ugyanilyen, hasonl vagy ezzel kompatibilis licenc alatt leszel kteles terjeszteni.

A Full Circle magazin teljesen fggetlen magazin Python 2. ktet full circle a Canonical-tl, az Ubuntu projektek tmogatjtl. A magazinban megjelen vlemnyek s ^ 2 tartalom llsfoglalsok a Canonical jvhagysa nlkl jelennek meg.

Hogyanok
rta: Greg Walters Elz rszek:
FCM 27.-34. szmokban az 1.-8. rszek

Programozzunk Pythonban - 9. rsz


az egyik rk kedvenc szmom) ha pldul a Clowns (The Demise of the European Circus with No Thanks to Fellini) szmrl volt sz, akkor csak az els 30 karakter volt meg a cmbl. Ez NAGYON frusztrllag hatott igen sok emberre. A sztenderd ID3-as elem egy id utn ID3v1-knt lett ismert, miutn bevezettek egy j formtumot, amit meglep mdon - ID3v2-nek neveztek el. Ez az j formtum lehetv tette vltoz hosszsg adatok trolst a fjl elejn, amellett, hogy a rgi ID3v1 meta-adat - a rgebbi tpus lejtszk miatt - mg mindig helyet kapott a fjl vgn. Most mr 256 Mb-nyi meta-adatot is eltrolhattunk. Ez pont idelis volt a rdillomsok s az olyan rltek szmra, mint amilyen n is vagyok. Az ID3v2 rendszer alatt minden egyes adatcsoport egy frame-ben (szelet) kap helyet, s mindegyik ilyen frame-nek van egy azonostja. A korai ID3v2-ben ez az azonost hrom karakter hossz volt. A jelenlegi verzi (ID3v2.4) mr ngy karakterest hasznl. Rgen egyszeren binris olvass mdban megnyitottuk volna a fjlt, s addig kutakodtunk volna benne, amg meg nem talltuk a keresett informcit. Mivel nem voltak sztenderd knyvtraink, amik ezt lekezeltk volna, ezrt ezt igen sok munka volt megcsinlni. Szerencsre, mostanra ezek mr rendelkezsnkre llnak. Mi itt a Mutagen nev projektet fogjuk hasznlni. Menjnk is a Synapticba s teleptsk a python-mutagent. Ha szeretnnk, akkor itt egy keresst is lefuttathatunk az ID3-ra. Azt fogjuk tapasztalni, hogy tbb mint 90 csomagot dob ki eredmnyl (Karmicban), majd, ha a Python szt is begpeljk a gyorskeres mezbe, akkor nyolc csomagot tallunk. Mindegyik mellett szlnak rvek s ellenrvek, de mostani projektnkhz a Mutagent fogjuk vlasztani. Nyugodtan beleshatjuk magunkat a tbbibe is kiegszt tanuls
tartalom ^

rlbb dolog, hogy nem tudom szben tartani, hogy mim s hol van. Ebben a leckben megnzzk, hogy hogyan tudunk ltrehozni az MP3-ainknak egy katalgust. Megismerkednk nhny jabb python koncepcival, amellett, hogy felfrisstjk az adatbzisokrl szerzett tudsunkat is. Elszr, nem rt tudnunk arrl, hogy egy MP3 fjl tartalmazhat nmagrl informcikat. Ilyen adat a dal cme, albuma, szerzje, stb. Ezek az informcik az ID3 elemekben helyezkednek el, amit meta-adatnak is szoktunk hvni. Az els idkben egy MP3 fjlban csak igen korltozott informcimennyisg volt eltrolhat. Ez eredetileg a fjl legutols 128 bjtjban foglalt helyet. Mivel ennek a blokknak igen kicsi volt a mrete, ezrt csak 30 karakter hossz lehetett a dal cme, szerzjnek neve, stb. Sok zenefjl szmra ennyi ppen elegend volt, de (s ez
full circle magazin Python 2. ktet

Itt hasznlhat: Kategrik:


Fejleszts Grafika Internet M/mdia Rendszer

Eszkzk:

CD/DVD Merevlemez eszkz Laptop Vezetk USB nlkli

a olyan vagy mint n, akkor szmtgpeden te is mp3 formtumban trolod kedvenc zenidet. Amikor kevesebb, mint 1000 szmod van, akkor mg elg knny megjegyezned, hogy mi s hol van. Mivel rgebben DJ voltam s zenim nagy rszt tkonvertltam, ezrt nekem ennl jval tbb MP3-am van. Rgebben a legnagyobb problmt a merevlemez kapacitsa jelentette szmomra. Azonban manapsg a legfruszt-

Programozzunk Pythonban 9. rsz cljbl. ... itt valami j dolog van. Kszen vagyunk a main s Most, hogy mr fel van tele- a usage metdusokkal. Mire ptve a Mutagen, elkezdhetnk lesznek ezek jk? Mieltt megkdolni. beszlnnk ket, helyezznk el mg egy dolgot. Induljunk egy mCat nev if __name__ == '__main__': projekt ksztsvel. Ezutn main() jhetnek az importjaink.

hivatkozni a metdusaira egy msik programbl.

el kilpnk az alkalmazsbl.

Ha ezzel kszen vagyunk, Ezutn, fogalmazzuk meg a akkor ksztsk el az error usage fggvnyt. Lent lthat a rutint. Itt van a teljes kdja: usage rutin teljes kdja.
def error(message): print >> sys.stderr, str(message)

Itt fogjuk ltrehozni a felhasznl szmra megjelen zenetet, mely akkor jelenik Mi a fene ez? Ezzel a trkkel meg, amikor nem megfelel from mutagen.mp3 import MP3 azt rjk el, hogy a fjlunkat k- paramterekkel indtjk el a import os pesek lesznk klnll alkalprogramunkat. Figyeljk meg, mazsknt, illetve jrahasznl- hogy a \n kifejezst egy j from os.path import hat modulknt egy msik sor, a \t-t egy tab kiratsjoin,getsize,exists programba beimportlva is hoz hasznljuk. Ezeken fell hasznlni. Gyakorlatilag azt import sys hasznljuk mg a %s-t az mondja ki, hogy HA ez a fjl a alkalmazs nevnek bekrf alkalmazs, akkor a main import apsw shez, mely a sys.argv[0]-ban rutin meghvsval tudjuk futvan eltrolva. Ezutn meghvEzekkel tbbnyire mr tall- tatni, klnben kzvetlenl egy juk az error rutint a message koztunk. Ezt kveten ltre sze- kiegszt modulknt fogunk kiratshoz, majd a sys.exit(1)retnnk hozni a fggvny deklarciinkat. def usage():
def MakeDataBase(): pass def S2HMS(t): pass def WalkThePath(musicpath): pass def error(message): pass def main(): pass def usage(): pass

Egy tirnytsnak nevezett dolgot alkalmazunk (a >>). Amikor a print-et hvjuk, valjban arra utastjuk a Pythont, hogy rassa vagy streamelje ki a sztenderd kimenetre a megadott paramtereket, ami legtbbszr az ppen fut terminlt jelenti. Ennek elrshez (a sznfalak mgtt) az stdoutot hasznljuk. Amikor hibazenetekkel dolgozunk, akkor az

message = ( '==============================================\n' 'mCat Finds all *.mp3 files in a given folder (and subfolders),\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)

full circle magazin Python 2. ktet

tartalom ^

parancssorbl kapott paramtereket (ha vannak egyltaln). def main(): Mindezt a sys.argv utastssal global connection global cursor tesszk. Kt paramtert kere# snk: az els az alkalmazs if len(sys.argv) != 2: neve, a msodik az MP3 fjlok usage() elrsi tja. Ha nincs meg else: StartFolder = sys.argv[1] mindkt paramter, akkor megif not exists(StartFolder): # From os.path hvjuk a usage szubrutint, mely print('Path {0} does not seem to kiratja az elbb megrt zeneexist...Exiting.').format(StartFolder) tet s kilp. Ha viszont megsys.exit(1) else: kaptuk mindkettt, akkor az Ifprint('About to work {0} nk else gra ugrik a vezrls. folder(s):').format(StartFolder) Ezt kveten eltroljuk a kiin# Create the connection and cursor. dul tvonalat a StartFolder connection=apsw.Connection("mCat.db3") cursor=connection.cursor() vltozban. Arra azonban # Make the database if it doesn't exist... gyelnnk kell, hogy ha szkz MakeDataBase() van az elrsi tban - mint # Do the actual work... pldul az (/mnt/musicmain WalkThePath(StartFolder) # Close the cursor and connection... /Adult Contemporary)-ben - a cursor.close() space utn kvetkez karakconnection.close() terek egy j paramterknt # Let us know we are finished... fognak rtelmezdni. Ezrt ha print("FINISHED!") brmikor szkz van az elrsi tban, akkor ne felejtsk el az egszet idzjelek kz rakni. stderrt szoktuk megadni. Mi is meghvjuk a sajt fggvnyeKvetkeznek belltjuk a conezt tesszk: tirnytjuk a print inket az igazi munka elvgznectiont s a cursort, elksztkimenett az stderr folyamra. shez. A kd fentebb lthat. jk az adatbzist, majd jn a Most dolgozzunk egy kicsit a Mint ahogy mltkor, most is tnyleges munka, amikor is meghvjuk a WalkThePath main fggvnyen. Itt fogjuk be- ltrehozunk kt globlis vltolltani az adatbzis kapcsolatot zt, melyeket az adatbziskeze- rutint, majd lezrjuk a kapcsolas kurzort, majd vetnk egy pil- lshez hasznlunk. Ezeket con- tot egy zenet kisretben, ami tudatja a felhasznlval, hogy lantst a parancssori paramte- nection-nek s cursor-nak kszen vagyunk. Itt van a rekre. Ha minden klappol, akkor hvjuk. Ezutn megnzzk a
full circle magazin Python 2. ktet

Programozzunk Pythonban 9. rsz

WalkThePath teljes kdja: http://pastebin.com/CegsAXjW. Elszr kinullzzuk azt a hrom szmllt, melyekben a munka llapott fogjuk kvetni. Ezutn megnyitunk egy fjlt, melyben az esetlegesen felmerl hibkat fogjuk loggolni. Ezt kveten, rekurzvan vgigmegynk a felhasznl ltal megadott tvonalon. Gyakorlatilag a megadott tvonalban lv mappkba lpegetnk be s ki, mikzben brmilyen .mp3 kiterjeszts fjl utn kutatunk. Ha ezzel kszen vagyunk, akkor megnveljk a mappa s a fjl szmlljt, hogy tudjuk menynyi fjlon vagyunk mr tl. Ha vgeztnk, akkor tmegynk minden fjlon. Kinullzunk minden helyi vltozt, mely az adott szmrl tartalmaz informcit. Itt hasznljuk az os.pathban lv join fggvnyt, melyet a megfelel elrsi t s fjlnv ltrehozshoz hasznlunk. Ezt fogja megkapni a mutagen, amibl meg tudja llaptani, hogy hol keresse az adott fjlt. Ezt kveten tadjuk a fjlnevet az MP3 osztlynak melyrt az audio egy pldnyt kapjuk cserbe.
tartalom ^

Programozzunk Pythonban Ha elkszltnk, akkor kiszedjk a fjlbl az sszes ID3 elemet s vgiglpkednk a listn, olyan tagok utn kutatva, amelyekre szksgnk van, majd ezeket az ideiglenes vltozkhoz rendeljk. Ezzel a mdszerrel minimalizljuk a lehetsges hibk szmt. Vessnk egy pillantst a kd azon rszre, mely a szmok sorszmt trolja. Amikor ezt visszakapjuk a mutagentl, akkor az lehet egy szm, egy 4/8-hoz hasonl sztring vagy _trk[0] s _trk[1], vagy akr semmi is. A try/except vezrlsi szerkezetet alkalmazzuk az olyan hibk elkapshoz, melyek emiatt eljhetnek. Most nzzk meg a rekordok kirst. Egy kicsit mshogy jrunk el mint mltkor. Most is ltrehozzuk az SQL utastst, mint eddig, de a behelyettestend rtkek helyre a ?-et rjuk. Az ASPW webhelye szerint ez egy biztonsgosabb mdszer. Nem fogok velk vitatkozni. A vgn lekezelnk minden elfordul hibt. Legtbbszr ezek a TypeError-ok vagy ValueError-ok lesznek, melyeket a nem lekezelhet Unicode karakterek okoznak. lljunk meg egy pillanatra a sztring rdekes formzsa s

9. rsz kiratsa fltt. Itt nem hasznljuk a % helyettest karaktert. Helyette a {0} tpus helyettestst alkalmazzuk, ami a Python 3.x specifikci rsze. Az alapvet alakja az albbi:
Print('String that will be printed with {0} number of statements).format(replaceme nt values)

terlnc 2:04 lesz s nem 2:4. A programunk teljes kdja itt tallhat: http://pastebin.com/rFf4Gm7E. Ez minden mra. Egy kicsit rvidebb lett mint mltkor, de taln picit bonyolultabb is. Ha van egy kis idnk, akkor nyugodtan belevethetjk magunkat a Mutagenbe, htha tallunk mg valami rdekeset. Biztosan rmmel fogjuk venni, hogy MP3 fjlok kezelsnl tbbre is kpes.

Ezt az alapvet szintaxist hasznljuk az efile.writelinesnl is. Vgl nzzk meg az S2HMS metdust. Ez a rutin a szm hosszt kapja paramterknt, amely egy mutagen ltal visszaadott lebegpontos szm. Ezt fogjuk ra:Perc:Msodperc vagy Perc:Msodperc alakra tkonvertlni. Figyeljk meg a return utastst. Ismt a Python 3.x-ben bevezetett szintaxist alkalmazzuk. Van azonban egy teljesen j dolog is. Helyettestsi halmazokat hasznlunk (0, 1, s 3), de mi a :02n az 1-es s 2-es szm utn? Ez azt mondja ki, hogy kt helyen szeretnnk csak bevezet nullkat ltni. Teht, ha a dal mrete 2 perc 4 msodperc, akkor a visszaadott karakfull circle magazin Python 2. ktet

Greg Walters a RainyDay Solutions

Kft. tulajdonosa, amely egy tancsad cg Aurorban, Coloradban, Greg pedig 1 972 ta foglalkozik programozssal. Szeret fzni, trzni, zent hallgatni, valamint a csaldjval tlteni a szabadidejt.

tartalom ^

Hogyanok
rta: Greg Walters Elz rszek:

Programozzunk Pythonban - 1 0. rsz


attribute=something>Node 2 data</node2> <node3> <node3sub1>more data</node3sub1> </node3> </root>

Nos... Beszljnk az XML-rl. A HTML-hez hasonlan, az XML FCM 27.-35. szmokban is egy mozaiksz, ami az eXaz 1.-9. rszek tensible Markup Language rviItt hasznlhat: dtse. Az adatok hatkony trolsra s interneten, vagy ms kommunikcis hlzaton val tovbbtsra talltk ki. Kategrik: Gyakorlatilag az XML egy szveges fjl, ami a sajt tagFejleszts Grafika Internet M/mdia Rendszer jaink (avagy elemeink) ltal van formzva, gy elg ndokuEszkzk: mentl a felptse. Mivel egy szveges llomnyrl van sz, CD/DVD Merevlemez eszkz Laptop Vezetk ssze lehet tmrteni a gyorUSB nlkli sabb s knnyebb tovbbtshoz. A HTML-lel ellenttben az XML nmagban nem kpes alsznleg mindenki semmire. Nem foglalkozik azhallotta mr az XML ki- zal, hogy te hogyan akarod az fejezst. Viszont nem adataidat elrendezni. Ahogy az biztos, hogy tudjuk, mi imnt mondtam, XML rsakor is ez. E havi anyagunk tmja az nem kell egy sor ltalnos XML lesz. Clunk, hogy tag-ra hagyatkozni. Elkszthetjk a sajtjainkat is. - megismerjk az XML-t - megmutassuk, miknt Nzznk egy ltalnos plkell rni s olvasni XML fjlokat dt XML fjlra: sajt alkalmazsokban. - felkszljnk a kvetkez <root> <node1>Data alkalomra tartogatott viszonylag Here</node1> nagy XML projektre. <node2
full circle magazin Python 2. ktet

Az els feltn dolog az indentls. Gyakorlatilag csak az emberi fogyaszts megknnytse miatt van. Az XML ugyanolyan jl lenne gy is:
<root><node1>Data Here</node1><node2 attribute=something>Node 2 data</node2><node3><node3sub 1>more data</node3sub1></node3></ro ot>

tartoznia. Az elemnevek tartalmazhatnak betket, szmokat s egyb karaktereket is, de nem kezddhetnek szmmal vagy kzpontozssal. A -, . s : jeleket a nevekben lehetleg kerljk el, mivel nhny alkalmazs parancsnak, vagy objektum adattagnak tekintheti ket. Tovbb a kettspontoknak is valami ms szerepk van.

Minden XML fjl alapveten egy fa is - a gykrtl kiindulva sztgazik. Minden XML llomnynak tartalmaznia KELL egy gykr elemet, ami minden ms elemnek az se. Vessnk ismt egy pillantst a plA <> cscsos zrjelek kztt lv tagokra van nhny dnkra. A root alatt hrom elrs. Elszr is, csak egyet- gyermek elemnk van (node1, node2, node3). A root elem lelen szbl llhatnak. Msodszor, amikor van egy nyit tag- szrmazottai kzti kapcsolatod (pl. <root>), akkor kell vala- hoz hasonlan, a node3 is a hol lennie egy ugyanolyan zr node3sub1-nek a szlje. tagnak is. A zr elem egy / Figyeljk meg a node2-t. jellel kezddik. A tagok is mVegyk szre, hogy a szoksos, retrzkenyek: a <node>, <Node> s <NodE> mind k- elemek kztti adatok mellett van mg egy, tulajdonsgnak lnbz elemet jell, amikhez (attribute) nevezett rtke is. megegyez zrtagnak KELL

tartalom ^

Programozzunk Pythonban Manapsg igen sok fejleszt azonban elkerli hasznlatukat, mivel az elemek kztti rtkknt is pp elg hatkonyak lesznek, ezen fell kevesebb pepecselssel is jr nlklzsk. Ennek ellenre ltni fogjuk, hogy mg mindig hasznljk ket. Egy kicsit ksbb mg kitrnk rjuk.
Nzznk most meg egy hasznos pldt (balra lent). Itt a gykrelem a people (emberek), melynek kt gyermeke van, person (szemly) nven. Minden personnek van hat leszrmazottja: firstname (keresztnv), lastname (veze-

10. rsz tknv), gender (nem), address (cm), city (vros) s state (llam). Els pillantsra azt hinn az ember, hogy ez egy adatbzis (gondoljunk vissza az utbbi nhny cikkre), s nem is tvednnk nagyot. Ami azt illeti, nhny alkalmazs XML fjlokat hasznl egyszer adatbziskezelsre is. Az XML-eket olvas alkalmazsok megrsa viszonylag egyszeren megoldhat. Csak nyissuk meg a fjlt, olvassunk be minden sort, majd az elem tpusa szerint foglalkozzunk a beolvasott sorokkal, vgl zrjuk le a fjlt. Mindazonltal ennl vannak kifinomultabb megoldsok is.

<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>

full circle magazin Python 2. ktet

A soron kvetkez pldkban Ami a kdunkat illeti, az els egy ElementTree-nek nevezett dolog, amit meg kell tennnk, knyvtr modult fogunk haszhogy leellenrizzk az Elementnlni. A Synapticbl kzvetlenl Tree teleptst. Itt a kd: fel lehet telepteni a pythonelementtree csomaggal. n import viszont inkbb az ElementTree elementtree.ElementTree as ET weblapjrl tltttem le a tree = forrst (elementtree-1.2.6ET.parse('xmlsample1.xml') 20050316.tar.gz): (http://effbot.org/downloads/#e ET.dump(tree) lementtree). Amint lejtt, a csoAmikor a tesztprogramot magkezelvel kitmrtettem futtatjuk, valami ilyesmit kellene egy ideiglenes mappba. Miutn ebbe belelptem, vgrehaj- kapnunk: tottam a sudo python setup.py /usr/bin/python u "/home/greg/Documents/articles/xml/read install utastst. Ezzel a fjlok bem- er1.py" soldtak a python <people> kzs mappjba, <person> <firstname>Samantha</firstname> hogy python 2.5-bl, <lastname>Pharoh</lastname> vagy 2.6-bl hasz<gender>Female</gender> nlni lehessen ket. <address>123 Main St.</address> Most mr elkezdhe<city>Denver</city> <state>Colorado</state> tnk dolgozni. Hoz</person> zunk ltre egy j <person> mappt ehavi k<firstname>Steve</firstname> dunknak, s ked<lastname>Levon</lastname> <gender>Male</gender> venc szvegszer<address>332120 Arapahoe kesztnket hasznl- Blvd.</address> va, msoljuk ebbe a <city>Denver</city> fenti XML adatot, <state>Colorado</state> </person> majd mentsk el </people> xmlsample1.xml" nven.

tartalom ^

Mindssze annyit csinltunk, hogy megnyitottuk az ElementTree-vel a fjlt, alapelemekre bontottuk a tartalmt, vgl kirattuk gy, ahogy az a memriban van. Semmi klns.

Programozzunk Pythonban 10. rsz


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

Most cserljk le az elbbi kdot a kvetkezre:


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)

s futtassuk jra. Most ilyen kimenetet kellene kapjunk:


/usr/bin/python u "/home/greg/Documents/article s/xml/reader1.py" Element: Samantha Element: Pharoh Element: Female Element: Main St. Element: Element: Colorado firstname Data: lastname Data: gender Data: address Data: 123 city Data: Denver state Data:

Most mr minden adat a tag neve mell kerlt. Egyszeren csak ki kellett ratnunk az eredmnyt. Nzzk meg, hogy mink van itt. Az ElementTree sztbontotta a fjlt egy tree nev objektumba. Ezutn megkrtk, hogy keresse meg a person sszes pldnyt. A hasznlt pldban csak kett ilyen van, de ez a szm lehet egy, vagy akr ezer is. A person a people

leszrmazottja, s tudjuk, hogy a people egyszeren egy gykrelem. Az sszes adatunk a personba van elhelyezve. Ltrehozunk egy for ciklust az szszes person objektumon val tlpegetsre. Ezutn ksztnk egy msik for ciklust az adatok persononknti kiszedshez, majd megjelentjk az elem nevt (.tag) s adatt (.text). Egy val letbl vett plda: n s a csaldom egy Geocaching nevezet tevkenysgben vesznk rszt. Azoknak, akik esetleg nem tudnk, mi is ez: egy kocka kincsvadszat, ami kzi GPS eszkzket hasznl valaki ms ltal elrejtett dolgok felkutatshoz. Az lta-

lnos koordintkat egy weblapon helyezik el, nha egy-kt nyom ksretben. Neknk anynyi a dolgunk, hogy beptygjk a koordintkat s megprbljuk megkeresni. A Wikipedia szerint tbb mint 1.000.000 aktv geocache weblap van vilgszerte, kztk valsznleg akad egy a krnykeden is. n kt weblapot hasznlok clpontok keresshez. Az egyik a http://www.geocaching.com/ a msik pedig a http://navicache.com/. Vannak mg msok is, de taln ez a kett a legnagyobb. Mindegyik clpont informcija egy alap XML fjlban van eltrolva. Vannak olyan alkal-

<?xml version="1.0" encoding="ISO88591"?> <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/cgi bin/db/displaycache2.pl?CacheID=11436</link> </waypoint> </loc>

by g_phillips

Navicache fjl
tartalom ^

full circle magazin Python 2. ktet

Programozzunk Pythonban mazsok, melyek be tudjk olvasni s tkldeni az adatokat a GPS eszkzre. Nhnyuk adatbzis-kezel programknt viselkedik - lehetsg van figyelemmel ksrni tevkenysgnket (nha) trkpek segtsgvel. Most mg csak a letlttt fjl sztbontsra fogunk koncentrlni.

10. rsz ebben az esetben figyelmen kvl hagyhat. A kvetkez sor a waypoint (csompont) gyermekelemet tartalmazza. (A csompont ebben az esetben a rejtekhely helyt jelenti.) Ez egy szmunkra fontos adat lesz. Itt van a rejtekhely neve, illetve szlessgi s hosszsgi koordinti, a zskmny tpusa s egy tovbbi informcikat tarA Navicachen talltam egy talmaz honlap linkje. A name nem tl rgi texasi feladvnyt. (nv) elem egy hossz karakAz elz oldal aljn lthat. terlnc, amiben van egy rakat hasznos informci, de ehhez Msoljuk ki a fenti adatokat elbb fel kell bontanunk mas mentsk el Cache.loc nv- gunknak. Ksztsnk el egy j vel. Mieltt nekillnnk kdolni, alkalmazst, ami beolvassa s vizsgljuk meg a rejtvny fjlmegjelenti ezt a fjlt. Legyen a jt. neve readacache.py. Kezdjk az elz pldabeli import s Az els sor csak annyit mond parse utastsokkal. neknk, hogy ez egy validlt XML fjl. Ezt nyugodtan figyel- import men kvl hagyhatjuk. A kvet- elementtree.ElementTree as ET kez sor (ami a loc-kal kezd- tree = ET.parse('Cache.loc') dik) a gykr, melynek version (verziszm) s src (forrs) Egyelre szeretnnk kiolvastulajdonsgai vannak. Emlkni a waypoint tagban lv adasznk mg, amikor korbban tokat. Ehhez az ElementTree azt mondtam, hogy nhny .find fggvnyt hasznljuk. Az fjlban tallkozhatunk attriberedmnyt a w objektumban tumokkal? Lesznek mg msok kapjuk vissza. is ebben az llomnyban, ahogy haladunk. Mg egyszer w = tree.find('.//waypoint') elmondom, hogy a gykr
full circle magazin Python 2. ktet

Ezutn t szeretnnk futni az Cache Size: Normal sszes adaton. Egy for ciklust Difficulty: 1.5 fogunk ehhez hasznlni. A ciklusban meg fogjuk nzni, hogy Terrain : 2.0]]></name> a tag a name, coord, type Ez egy igen hossz sztring. A s link kzl melyik. Ettl fgrejtekhely id (azonost) egy gen fogjuk kiszedni a benne lv adatokat ksbbi kirats- tulajdonsg. A nv a CDATA s Open Cache: kztti rsz. ra. Fel fogjuk darabolni ezt a sztrinfor w1 in w: get tovbbi, neknk megfelel if w1.tag == "name": rszekre. Egy karakterlnc rMivel elszr a name tagot szt az albbi mdon kapjuk keressk, nem rt, ha megnz- meg: zk a beolvasand adatokat. newstring =
<name id="N02CAC"><![CDATA[Take Goofy Pictures at Grapevine Lake by g_phillips Open Cache: Unrestricted Cache Type: Normal oldstring[startposition:endpo sition]

Teht, a lenti kddal kiszedhetjk a neknk kell rszeket. Ezutn meg kell szereznnk azt az azonostt, ami a name

# 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:]

10

tartalom ^

Programozzunk Pythonban 10. rsz tag tulajdonsgban van. Attribtumok jelenltt gy krdezzk le (termszetesen most tudjuk, hogy mik vannak):
if w1.keys(): for name,value in w1.items(): if name == 'id': CacheID = value

Greg Walters a RainyDay Solutions

Foglalkozzunk most a maradk - koordintk, tpus s link - elemekkel, a kd itt kzpen lthat: elif w1.tag Vgl kiratjuk a lentebb lthat mdon. Mr most eleget tudunk ahhoz, hogy a legtbb XML fjlt olvashassuk. Mint mskor is, a teljes forrskdot a honlapomrl lehet letlteni. Kvetkez alkalommal felhasznljuk megszerzett XML tudsunkat egy csodlatos idjrsjelent oldal lekrdezshez s terminlban val megjelentshez. J szrakozst!

Kft. tulajdonosa, amely egy tancsad cg Aurorban, Coloradban, Greg pedig 1 972 ta foglalkozik programozssal. Szeret fzni, trzni, zent hallgatni, valamint a csaldjval tlteni a szabadidejt.

== "coord": if w1.keys(): for name,value in w1.items(): if name == "lat": Lat = value elif name == "lon": Lon = value elif w1.tag == "type": GType = w1.text elif w1.tag == "link": 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

import elementtree. ElementTree as ET tree = ET. parse( ' Cache. loc' ) w = tree. find( ' . //waypoint' ) for w1 in w: if w1. tag == " name" : # 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: ] if w1. keys( ) : for name, value in w1. items( ) : if name == ' id' : CacheID = value elif w1. tag == " coord" : if w1. keys( ) : for name, value in w1. items( ) : if name == " lat" : Lat = value elif name == " lon" : Lon = value elif w1. tag == " type" : GType = w1. text elif w1. tag == " link" : if w1. keys( ) : for name, value in w1. items( ) : Info = value Link = w1. text print " Cache Name: " , CacheName print " Cache ID: " , CacheID print " Open Cache: " , OpenCache print " Cache Type: " , CacheType print " Cache Size: " , CacheSize print " Difficulty: " , Difficulty print " Terrain: " , Terrain print " Lat: " , Lat print " Lon: " , Lon print " GType: " , GType print " Link: " , Link print " =" *25

full circle magazin Python 2. ktet

1 print 1

" finished"

tartalom ^

Hogyanok
rta: Greg Walters Elz rszek:

interfsz) rvidtse. Ez egy divatos kifejezs arra, amikor FCM 27.-36. szmokban egy msik programhoz kapcsoaz 1.-10. rszek ldunk. Gondolj az importlt Itt hasznlhat: fggvnyknyvtrakra. Nmelyikk nll alkalmazsknt is futtathat, de fggvnyknyvtrknt importlva a legtbb Kategrik: funkcit sajt programunkban is felhasznlhatjuk, s gy haszFejleszts Grafika Internet M/mdia Rendszer nlatba vehetjk msvalaki kdjt. Esetnkben idjrsi Eszkzk: informcikat fogunk lekrdezni a wunderground weboldalrl, specilisan formzott URL cCD/DVD Merevlemez eszkz Laptop Vezetk USB nlkli mek segtsgvel anlkl, hogy bngszt hasznlnnk. Egyesek szerint az API olyan, mint egy msik program titkos hts egutbb azt grtem, hogy az XML tudsunkat bejrata, amit a programoz(k) felhasznlva idjrsi in- direkt neknk ksztettek. gy, vagy gy, ez az alkalmazsnak formcikat fogunk leegy olyan kiegsztse, amivel szedni egy weboldalrl s egy terminlban jelentjk meg azo- annak ms alkalmazsokban trtn felhasznlst segti kat. Nos, ez most elrkezett. el. A www.wunderground.com rdekesen hangzik? Nos, API-jt fogjuk felhasznlni. Mr hallom a torkotokbl felmorajl olvass tovbb, kedves Padawanom. krdst: Az meg mit jelent, hogy API?. Az API az ApplicaIzztsd be a kedvenc bngtion Programming Interface szdet s irny a www.wunder(azaz alkalmazs programozi full circle magazin Python 2. ktet

Programozzunk Pythonban - 1 1 . rsz


ground.com. Most rd be az irnytszmod, vagy egy vrost s egy llamot (vagy egy orszgot) a keres mezbe. Itt rengeteg informcit tallsz. Most ugorjunk az API weboldalra: http://wiki.wunderground.com/i ndex.php/API_-_XML Az egyik els dolog, amit szreveszel, az API felhasznlsi felttelei. Krlek, olvasd el, s tartsd be. Nem frasztak s igazn knnyen betarthatk. Szmunkra a GeoLookupXML, WXCurrentObXML, AlertsXML s ForecastXML hvsok lesznek rdekesek. Sznj egy kis idt az tolvassukra. A GeoLookupXML rutin tanulmnyozst rd bzom. Kt msik parancsra szpontostunk, most a WXCurrentObXML-re (aktulis llapot) s legkzelebb a ForecastXML-re (elrejelzs). Az Amerikai Egyeslt llamokban a 80013-as irnytszmot rd t a sajtodra, vagy ha ms orszgban lsz, megprblhatsz vrost s orszgot megadni gy: Paris, France, vagy London, England. Itt a ForecastXML-hez tartoz link: http://api.wunderground.com/a uto/wui/geo/ForecastXML/index. xml?query=80013 Itt is rd t a 80013-as irnytszmot a sajtodra, vagy adj meg egy vrost s egy orszgot. Kezdjk az aktulis informcikkal. Msold a cmet a kedvenc bngszdbe. Temrdek informcit kapsz cserbe. Eldntheted, melyikeket tartod igazn fontosnak, de mi csak pr elemet fogunk megvizsglni.

Itt a link a WXCurrentObXMLPldnkban a kvetkez hez: cmkkre fordtunk figyelmet: http://api.wunderground.com/a uto/wui/geo/WXCurrentObXML/i display_location ndex.xml?query=80013

12

tartalom ^

Programozzunk Pythonban 11. rsz observation_time bes kapcsolatot s elkezdjk weather megkeresni a cmkinket. Taltemperature_string lat esetn a cmke szvegt elrelative_humidity mentjk egy vltozba, amibl wind_string ksbb majd kirhatjuk a kimepressure_string netre. Amint megvan minden adatunk, megjelentjk ket. Ezt a listt termszetesen Elg egyszer koncepci. bvtheted, ha ms cmkkre is kvncsi vagy. Pldnk azonban Kezdjk azzal, hogy a fjezekkel a cmkkkel is elegend lunknak a w_currents.py nevet tmpontot nyjt majd tetszle- adjuk. Itt a kdunk import ges irny s mrtk folytarsze: tshoz.
Most, hogy tudjuk, mit fogunk keresni, kezdjk el lekdolni az alkalmazsunkat. Nzzk a programot nagy vonalakban. Elszr megvizsgljuk, mit krt tlnk a felhasznl. Ha megadott egy cmet, akkor azzal, egybknt pedig a fprogramban rgztett, alaprtelmezett cmmel dolgozunk. Ezt tadjuk a getCurrents rutinnak. A cmet beptjk a webes lekrdezsbe. A vlasz fogadsra s objektumm alaktsra az urllib.urlopen-t hasznljuk, majd a ltrejtt objektumot tadjuk az ElementTree fggvnyknyvtr parse fggvnynek. Ezutn lezrjuk a wefrom 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) """

Aztn rjunk egy pr sor sgszveget (jobbra fent) az importok fl. Mindenkppen tripla idzjeleket hasznlj. gy lehet tbbsoros kommenteket kszteni. Ezt a rszt ksbb mg egy kicsit rszletezzk. Most hozzuk ltre az osztlyok vzt (jobbra lent) s a kvetkez oldalon lthat f rutinokat.
full circle magazin Python 2. ktet

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 doublequotes) if city/state (US) use something like "Aurora,%20CO" or Aurora,CO (use doublequotes) if city/country, use something like "London,%20England" (use doublequotes) """ def getCurrents(self,debuglevel,Location): pass def output(self): pass def DoIt(self,Location): pass #========================================= # END OF CLASS CurrentInfo() #=========================================

13

tartalom ^

Programozzunk Pythonban Korbbi cikkekbl biztosan emlkszel az if __name__ sorra. Ha nll alkalmazsknt hvjuk meg ezt a sort, akkor a main rutin fog lefutni - ellenkez esetben programunkat egy fggvnyknyvtr rszeknt hasznljuk fel. A main rutinba kerlve megvizsgljuk a kapott paramtereket, ha egyltaln van ilyen.
Ha a felhasznl a -h, vagy --help paramtert adta meg, akkor a programkd elejn lv tripla-idzjeles sgsorokat rjuk ki. Ezt a usage rutin hajtja vgre a __doc__ kiratsval.

11. rsz gy, hogy megkeresve a szkzket, jraformzza a karakterlncot, mieltt tadja a rutinnak. Ezt akr most meg is teheted.
Vgl ltrehozunk egy pldnyt a CurrentInfo osztlyunkbl, amit currents-nek neveznk el, s a cmet tadjuk a DoIt rutinnak. Tltsk is ki nyomban:
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:])

Nagyon egyszer. A cmet s Ha a felhasznl a -l (cm), a debug levelt tadjuk a vagy a -z (irnytszm) kap- getCurrents rutinnak, majd meghvjuk az output rutint. Br csolt adja meg, azzal fellrja kirathatnnk az eredmnyt a beptett cmet. Ha cmet adsz meg, mindenkppen tedd egyszeren kzvetlenl a getCurrents-bl is, rugalmasabidzjelek kz s soha ne hasznlj szkzket. Pldul, a b tesszk a programunkat azltal, ha szksg esetn msTexas-i Dallasra vonatkoz aktulis rtkeket megkaphatod a ms mdon is kirathatjuk az eredmnyt. -l "Dallas,Texas" paramterezssel. A getCurrents forrsa a kvetkez oldalon tallhat. Szemfles olvasink biztosan szrevettk, hogy a -z s -l Van itt egy debuglevel nev kapcsolk nagyjbl azonosak. paramternk. Ennek segtsAz -l mkdst talakthatod
full circle magazin Python 2. ktet

gvel hasznos informcikat rathatunk ki, ha a dolgok nem pont gy alakulnnak, ahogy szerettk volna. Ez a programozs korai szakaszban is hasznos lehet. Ha a programod mkdse mr teljes megelgedssel tlt el, minden debuglevellel kapcsolatos rszt trlhetsz. Mieltt kzzteszed a programot a nagyrdem sz-

mra, mint minden hasonl esetben, ezt a kdot felttlenl tvoltsd el, majd mgegyszer teszteld le, mieltt tjra indtod. Most egy try/except wrapperrel fogjuk biztostani a programunkat lefagys ellen, ha valami rosszul slne el. A try oldalon belltjuk az URL-t s
tartalom ^

14

Programozzunk Pythonban egy 8 msodperces hatridt (urllib.socket.setdefaulttimeout (8)). Ezt azrt tesszk, mert a wunderground nha tlterhelt s nem vlaszol. gy nem fogunk lni s vrni a webre a vgtelensgig. Ha tbbet szeretnl megtudni az urllibrl, j kiindulpont a http://docs.python.org/library/u rllib.html.
Ha brmi vratlan trtnik, tkerlnk az except rszbe, kirunk egy hibazenetet, s kilpnk (sys.exit(2)). Felttelezve, hogy minden mkdik, nekiltunk a cmkk keressnek. Elsknt a cmnket keressk ezzel az utastssal: tree.findall("//full"). Emlkezznk csak, a tree az elementtree elemzsbl szrmaz objektum. Hogy pontosan

11. rsz mit ad vissza a website API, azt az albbiakban lthatjuk.


Ez a <full> cmke els elfordulsa, ami esetnkben az Aurora, CO rtket viseli. Ezt akarjuk cmnkknt felhasznlni. Ezutn az observation_ time cmkt keressk, azaz azt az idpontot, amikor az aktulis informcik rgztve lettek. Ugyanezzel a mdszerrel keressk meg az sszes szksges informcit. Vgl meghvjuk az output rutinunkat, ami a kvetkez oldal bal fels rszn tallhat. Itt egyszeren kirjuk a vltozkat. Ennyi az egsz. Egy plda kimenet az n irnytszmommal s 1-es debuglevel

<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>

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

getCurrents rutin

full circle magazin Python 2. ktet

15

tartalom ^

Programozzunk Pythonban 11. rsz


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

rtkkel az oldal aljn lthat. Vedd figyelembe, krlek, hogy olyan tageket vlasztottam, amelyek a Farenheit s Celsius rt-

Legkzelebb az API elrejelzs rszre koncentrlunk. Addig is, j szrakozst!

keket is tartalmazzk. Ha pldul csak a Celsius rtkeket szeretnd megjelenteni, a <temperature_string> cmke helyett a <temp_c> cmkt is hasznlhatod.

Greg Walters a RainyDay Solutions

A teljes forrs letlthet a: http://pastebin.com/4ibJGm74 cmrl.

Kft. tulajdonosa, amely egy tancsad cg Aurorban, Coloradban, Greg pedig 1 972 ta foglalkozik programozssal. Szeret fzni, trzni, zent hallgatni, valamint a csaldjval tlteni a szabadidejt.

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.

full circle magazin Python 2. ktet

16

tartalom ^

Hogyanok
rta: Greg Walters Elz rszek:

Programozzunk Pythonban - 1 2. rsz

az elrejelzsnek is van. Az Lent lthat a krnykem dtum valjban egy idpont. elrejelzs XML oldala: txt_forecastjnak egy kis szele- Ez gyakorlatilag az elrejelzs FCM 27.-37. szmokban http://api.wunderground.com/a te. kiadsnak ideje. A <number> az 1.-11. rszek uto/wui/geo/ForecastXML/index. tag mondja meg, hogy mennyi Itt hasznlhat: xml?query=80013 A txt_forecast szlelem uelrejelzs van az elkvetkez tn tallunk egy date (d24 rra. Nem emlkszem Akrcsak mltkor, most is a tum), s egy number (szm) olyan esetre, amikor ez az r80013-at meg tudjuk vltozelemet, majd egy olyan foretk kettnl kevesebb lett volKategrik: tatni a mi Vros/Orszgunkra, castday nev tagot aminek na. Minden 24 rs peridushoz Vros/llamunkra vagy irnyt- vannak sajt gyermekei, ezek: (<forecastday>) tartozik egy Fejleszts Grafika Internet M/mdia Rendszer szmunkra. Valsznleg 600 period (ciklus), icon (ikon), ciklus szm, tbbfle ikon belsornyi XML kdot fogunk vissza- icons (ikonok), title (cm) s lts, egy cm opci (Today Eszkzk: kapni. A gykrelem a forevalami fcttext nev dolog, az[ma], Tonight [ma este], Tocast (elrejelzs), melynek tn ezek ismtldnek. Az els morrow [holnap]), s a simple dolog amit szrevehetnk, az forecast (rvid elrejelzs) CD/DVD Merevlemez eszkz Laptop Vezetk ngy gyermekeleme van: USB nlkli termsofservice (a szolgltaaz, hogy a txt_forecast alatt a szvege. Ez egy gyors sszegts felttelei), txt_forecast <txt_forecast> (szveges elrejelzs), simplz alkalommal meg<date>3:31 PM MDT</date> nztk a wunderground leforecast (egyszer elrejel<number>2</number> zs) s moon_phase (holdf<forecastday> API-jt s rtunk is egy zis). Mi csak a txt_forecast-ra <period>1</period> kis kdot az aktulis <icon>nt_cloudy</icon> s a simpleforecast-ra fogunk idjrs lekrdezshez. Most +<icons></icons> az API idjrs elrejelz rsz- szortkozni. <title>Tonight</title> <fcttext> vel fogunk foglalkozni. Ha nem Mivel mr tnztk a usage, Mostly volt alkalmunk elolvasni az el- main s if __name__ rszeket, percent chance of thunderstorms in cloudy with a 20 the evening...then z kt, XML-lel foglalkoz cikket ezrt ezeket rtok hagyom, s partly cloudy after midnight. Lows in the mid 40s. - klnskppen az elzt - ak- most csak az igazn rdekes Southeast winds 10 to 15 mph shifting to the south after midnight. kor, mieltt tovbblpnnk min- rszekre fogunk koncentrlni. </fcttext> denkppen fussuk t ket. </forecastday> Mr mutattam egy darabkt a +<forecastday></forecastday> Mint ahogy az aktulis idj- txt_forecast-bl, ezrt kezdjnk </txt_forecast> rsnak is volt egy webcme, gy azzal. full circle magazin Python 2. ktet 1! tartalom ^

Programozzunk Pythonban 12. rsz zse a kvetkez 12 ra idj- import sys rsnak. import getopt
Mieltt nekiltnnk kdolni, Most kezddhet a mai elnem rtana egy pillantst vetni ads. Ltrehozunk egy __init__ az xml <simpleforecast> rsz- szubrutint a szmunkra szksre, mely jobbra lthat. ges vltozk belltshoz s kitrlshez. Ezt jobbra fenn a Van egy <forecastday> kvetkez oldalon lthatjuk. tagnk minden egyes idjrsi ciklushoz, mely ltalban hat Ha nem rdekel minket napot jelent, belertve a mait mindkt hmrsklet hasznlais. Az albbi adatok llnak ren- ta (Fahrenheit s Celsius) , akkor delkezsnkre: dtum tbbfle hagyjuk ki a megfelel vltozformtumban (n a <pretty> csoportot. n mindkettt alkalelemet szeretem), az elrejelmazni fogom. zett hmrskletek Fahrenheitben s Celsiusban, tlagos Ezutn elksztjk a lekrdekrlmnyek, klnbz ikozs metdust, mely letlti az nok, egy gbolt ikon (az elemelrejelzst. Ez lthat a kvetzlloms gboltjnak llapokez oldalon lent. ta), s a pop, ami a Probability Of Percipitation (csapaMindez nagyon hasonl a dkvalsznsg). Nhny mltkori, jelenlegi llapotokat rdekes informcit szolgltat a lekrdez rutinhoz. Az egyetlen <moon_phase> tag, mint plnagy klnbsg (eddig) a haszdul a naplemente, napfelkelte nlt URL-ben van. Ezen a pons hold informcikat. ton azonban nhny dolog megvltozik. Mivel tbb olyan Most nzzk a kdot. Itt van gyermek is van, melynek a szaz import szakasz: ln bell ugyanaz a neve, ezrt a parseol hvsokat egy kiss from xml.etree import mshogy kell hasznlni. A kd a ElementTree as ET kvetkez oldalon, balra fenn import urllib lthat.
full circle magazin Python 2. ktet

<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>

1!

tartalom ^

Programozzunk Pythonban 12. rsz


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)

full circle magazin Python 2. ktet

19

tartalom ^

Programozzunk Pythonban Vegyk szre, hogy egy tree.find hvst s egy for ciklust hasznlunk az adatok bejrshoz. Szomor dolog, hogy a Pythonban - ms nyelvekkel ellenttben - SELECT/CASE vezrlsi szerkezet nincs. Az IF/ELIF megolds azonban elg jl mkdik, csak egy kicsit ormtlanabb. Nzzk meg a kdot kzelebbrl. Az fcst vltozhoz hozzrendeljk a <txt_forecast> elemben lv sszes adatot. Ezzel meglesz minden informci az adott csoportbl. Ezutn megkeressk a <date> s <number> tagokat - mivel k egyszer els szint elemek - s betltjk ket a vltozinkba. Ekkor a dolgok egy kicsit tovbb bonyoldnak. Vessnk ismt egy pillantst a kapott xml pldnkra. A <forecastday> elemnek kt pldnya van. A <forecastday> alatt lv alelemek a <period>, <icon>, <icons>, <title> s <fcttext>. Egy ciklussal titerlunk rajtuk, mikzben ismt az IF utastst hasznljuk a vltozkba val betltskhz.
Ezt kveten meg kell nznk az elkvetkez X nap rszletesebb elrejelzst. Gyakor-

12. rsz latilag ugyanazt a mdszert hasznljuk. Ezt jobbra lthatjuk.


Ltre kell hoznunk az output (kimenet) rutint. Ez - akrcsak mltkor - most is elg ltalnos lesz. A kdot a kvetkez oldalon talljuk. Ismt, ha nem akarjuk mindkt hmrsklet - a Celsiust s Fahrenheitet- is hasznlni, akkor mdostsuk a kdot megfelelen. Vgl van egy Dolt szubrutinunk:
def DoIt(self,Location,US,Include Today,Output): self.GetForecastData(Lo cation) self.output(US,IncludeT oday,Output)

Most a kvetkezkppen hvhatjuk a rutint:


forecast = ForecastInfo() forecast.DoIt('80013',1,0,0) # Insert your own postal code

#================================= # 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)

A teljes mkd kd itt tallhat: http://pastebin.com/wsSXMXQx J szrakozst a kvetkez alkalomig.


Greg Walters a RainyDay Solutions
Kft. tulajdonosa, amely egy tancsad cg Aurorban, Coloradban, Greg pedig 1 972 ta foglalkozik programozssal. Szeret fzni, trzni, zent hallgatni, valamint a csaldjval tlteni a szabadidejt.
tartalom ^

Ennyi lenne mostanra. Az alert rszt meghagyom nektek, ha esetleg vgig akarntok menni rajta.
full circle magazin Python 2. ktet

20

Programozzunk Pythonban 12. rsz


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]))

full circle magazin Python 2. ktet

21

tartalom ^

Hogyanok
rta: Greg Walters

Programozzunk Pythonban - 1 3. rsz


#!/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()

bben a hnapban a Curses Pythonban val hasznlatrl fogunk beszlgetni. Nem, nem arrl lesz sz, hogy hogyan kromkodjunk Pythonul (curseing = kromkods, ford.), de akr erre is vetemedhetnk, ha szksgt reznnk. Most azonban a Curses modul hasznlatt nzzk meg, mellyel cifrbb tehetjk a kpernykimenetet. Ha elg idsek vagynk, akkor emlkezhetnk a szmtgpek korai idszakra, amikor mg zleti nagygpeink voltak, s buta kis terminlokkal (kperny s billentyzet) lehetet be-, illetve kirni adatokat. Tbb terminl is csatlakozhatott egy szmtgphez. A gond csak az volt, hogy a szmtgp-terminlok nem voltak tl okosak. Nem ltak rendelkezsnkre se ablakok, se sznek, se semmi, csak 24 darab, 80 karakternyi hossz sor (legjobb esetben). Mg a DOS s a CP/M idszakban - amikor a szemlyi szmtgpek elterjedtek - is csak

ennyink volt. Amikor a programoz bonyolultabb kiratson dolgozott (legalbbis ahhoz az idszakhoz kpest) - kivltkppen adat ki- s berskor ngyzetrcsos paprt hasznltak a kperny megtervezshez. Minden egyes ngyzet egy karakterpozcinak felelt meg. Amikor terminlban fut Python programmal dolgozunk, mg mindig a 24x80-as kijelzvel kell megkzdennk. Habr, ez az akadly knnyen legyzhet nmi elreltssal s elkszlettel. Teht, csak el kell mennnk venni egy-kt fzetet a helyi papr-rszer boltbl.

majd meghvjuk a myscreen objektumot (myscreen = curses.initscr()). Ez olyan mint egy vszon, amire majd festeni fogunk. Ezt kveten hasznljuk a myscreen.border(0) hvst egy szegly megrajzolsshoz Mindenesetre vgjunk bele a kperny krl. Mindez nem els Curses programunkba, ami ktelez, de jobban fog tle kijobbra fenn lthat. Miutn ve- nzni a kijelz. Aztn a Curses tettnk egy pillantst a kdra, addstr() metdust hasznljuk elmagyarzom az egszet. egy szveg kirshoz a 12-ik sor 25-ik pozcijtl. Vgl Rvid s egyszer. Ki is ele- meghvjuk a refresh() tagfggmezzk soronknt. Az elsben vnyt, ami lthatv teszi munletudjuk az importjainkat, amik- knkat. Ha nem frisstennk a nek mr elg ismerseknek kel- kpernyt, akkor a vltoztatlene lennik mostanra. Ezutn sok nem lennnek rzkelheltrehozzuk az j Curses kper- tk. Ezutn megvrjuk, amg a ny objektumot, inicializljuk, felhasznl megnyom egy gomfull circle magazin Python 2. ktet

bot (getch), majd felszabadtjuk a kijelz objektumot (endwin), hogy a terminl a szoksos mdon tudjon mkdni. A curses.endwin() hvs egy KIEMELTEN fontos dolog, mivel a konzolunk nagyon ramaty llapotban lesz, ha nincs meghvva. Magyarul, sose feleljtsk el ezt a metdust meghvni mieltt befejeznnk az alkalmazsunk futtatst. Mentsk el a programot CursesExample1.py nven s futtassuk egy terminlban. Nhny dolgot rdemes megjegyezni. Mindig, amikor szeglyeket hasznlunk, a kerettel elvesztnk egy hasznlhat
tartalom ^

22

Programozzunk Pythonban karakterpozcit. Tovbb, mind a sor, mind a karakter pozci szma NULLVAL kezddik. Ez azt jelenti, hogy az els sor a 0.-ik, az utols a 23.-ik. Azaz, a fels bal sarok pozcija 0;0 s az als jobb 23;79. Nzznk meg egy rvid pldt (jobbra fenn), mely ezt mutatja be.

13. rsz gondolunk nhny szmmal korbra (8. rsz), akkor emlkezhetnk a szakcsknyves alkalmazsra, melynek volt egy menje. Amikor kirattunk valamit, akkor minden egyszeren fentebb csszott. Most ezt az tletet felhasznlva ltrehozunk egy ltszatment, amit ksbb akr fel A try/finally blokkok kivtel- is hasznlhatunk a szakcsvel elg egyszer dolgok vanknyves alkalmazs kicsinosnak itt. Emlkezznk, hogy a tshoz. Lent lthat a rgi curses.endwin NAGYON fontos megolds. s mindig meg kell hvni kilps eltt. Ezzel a mdszerrel azonEz alkalommal a Cursest ban, mg ha minden rosszul fogjuk hasznlni. Kezdjk az megy is, az endwin rutin meg albbi sablonnal. Lehet, hogy fog hvdni. Ugyanez sok ms hasznos lenne elmenteni ezt mdon megoldhat, de sza kddarabkt (jobbra lenn) momra ez a legkzenfekvbb. az esetleges jvbeli programjainkhoz. Most ksztsnk egy jl kinz menrendszert. Ha visszaAhhoz, hogy a fjlon
=================================================== 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 >

#!/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,"1234567890123456789012345678901234 5678901234567890123456789012345678901234567890") 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()

full circle magazin Python 2. ktet

23

tartalom ^

Programozzunk Pythonban 13. rsz dolgozhassunk a sablon mdostsa nlkl, elbb mentsk el curses.initscreen LogicLoop cursesmenu1.py nven.
Mieltt tovbblpnnk a kddal, megnzzk az egszet lpsekben. Itt (jobbra fenn) lthat a feladatunk pszeudo-kd alakja. Termszetesen ez a pszeudo-kd csak egy lkd. Ennek ellenre elg j arra, hogy megfelel kp alakuljon ki bennnk az egsz dologrl. Mivel mindez csak egy plda, ezrt nem is elemezzk ki jobban, de ha szksgt rezzk, akkor elmlylhetnk benne. Kezdjk a main ciklussal (kzpen jobbra). Nem sok programozni val akad itt. Akrcsak a sablonban, itt is megvannak a try|finally blokkjaink. Inicializljuk a Curses kijelzt, majd meghvjuk a LogicLoop rutint. Ez a kd jobbra lenn lthat. Mivel ez is csak egy plda, ismt nem sok ltnival akad. Kt rutint hvunk meg. Az egyiket DoMainMenunek, a msikat MainInKey-nek nevezik. (Jobbra lenn lthat) A Do-MainMenu

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()

full circle magazin Python 2. ktet

24

tartalom ^

Programozzunk Pythonban megjelenti a fment, a MainInKey pedig lekezel minden mst.

13. rsz tin. Mindaddig, amg a beolvasott rtk nem 0, egy while ciklusban vagyunk. A ciklusban leellenrizzk, hogy a kapott adat Figyeljk meg, hogy itt kp- megegyezik-e klnbz rternytrlsen (myscreen.erase) kekkel, s ha igen, akkor egy s a kirand dolgokon kvl sor rutint hvunk meg. Vgl ms nincs. Sehol nem ltunk mikor kszen vagyunk, meghvbillentyzetet kezel kdot. Ez juk a fment. A legtbbjket a MainInKey feladata, ami itt mostanra mr egyedl is meg lenn lthat. tudjuk oldani, de a 2-es opcit Search for a Recipe (Recept Ez is egy igen egyszer rukeresse) - kln is megnzzk.
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

full circle magazin Python 2. ktet

25

tartalom ^

Programozzunk Pythonban 13. rsz http://docs.python.org/library/cu Ez a men rvid s egyszer. rses.html cmen rhet el. Az InKey2 rutin (elz oldalon jobbra) egy kiss bonyolultabb. Tallkozunk legkzelebb. Megint a szoksos while ciklust hasznljuk. A doloop vltozt 1-re lltjuk, hogy a ciklus addig fusson, amg nincs meg, amit akartunk. A break hvst hasznljuk a ciklusbl val kilHOPSZ! pshez. A hrom opci nagyon hasonl. A f klnbsg, hogy gy tnik, hogy a 11. rsz egy tmpstr nev vltozval kezkdja a Pastebinen nem volt dnk, majd hozzfzzk azt a rendesen indentlva. A heszveget, ami ki lett vlasztva, lyes kd URL-je ez: ezzel egy picit bartsgosabb http://pastebin.com/Pk74fLF3 tve azt. Ezutn a keressi szveg bekrshez a GetSearchKrlek nzd meg a Line-t hvjuk meg. A getstr ruhttp://fullcirclemagazine.past tinnal karakterek helyett egy ebin.com lapot az sszes sztringet olvasunk be a felhaszeddigi (s jvend) Python nltl. Vgl visszaadjuk a kakdrt. rakterlncot az input rutinunknak tovbbi feldolgozsra.
A teljes kd itt rhet el: http://pastebin.com/ELuZ3T4P Mg egy utols dolog. Ha mlyebben rdekel a Curses programozs, akkor sok ms mdszer is megtallhat a mostanin fell. Egy Google keressen kvl a legjobb kiindulpont a hivatalos dokumentci honlapja lehet, mely a
Greg Walters a RainyDay Solutions

Kft. tulajdonosa, amely egy tancsad cg Aurorban, Coloradban, Greg pedig 1 972 ta foglalkozik programozssal. Szeret fzni, trzni, zent hallgatni, valamint a csaldjval tlteni a szabadidejt.

full circle magazin Python 2. ktet

26

tartalom ^

Hogyanok
rta: Greg Walters

Programozzunk Pythonban - 1 4. rsz


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()

egutbb a Curses-rl kezdtnk el beszlni. Most mr mlyebbre fogjuk sni magunkat a tmban, kifejezetten a sznekkel kapcsolatos parancsokra koncentrlva. Gyorsan sszefoglalom a lnyeget, arra az esetre, ha nem olvasttok volna az elz cikket. Kezdsknt be kell importlni a curses csomagot. Ezutn meg kell hvni a curses.initscr metdust. Ahhoz, hogy szveget rhassunk a kpernyre, a addstr fggvnyt kell hasznlni, majd a refresh-t a vltoztatsok megjelentshez. Vgl, meg kell hvni a curses.endwin()-t a terminl ablak normlis llapotra val visszalltshoz. Most egy rvid s egyszer programot fogunk kszteni, mely sznes lesz. Az egsz nagyon hasonl az eddigiekhez, annyi csak a klnbsg, hogy van nhny j parancs. Elszr a curses.start_color() segtsgvel tudatjuk a rendszerrel, hogy mely sznekre van szksgnk. Ezt kveten belltjuk az eltr

s httr sznprt. Sok fajta prt bellthatunk, melyeket brmikor fel tudunk hasznlni. Ezt a curses.init_pair fggvnynyel tesszk meg. A szintaxis:
curses.init_pair([pairnumber] ,[foreground color],[background color])

A curses.COLOR_ szveg s a szn megfelel angol nevnek az sszefzsvel llthatjuk be a szneket. Pldul: curses.COLOR_BLUE vagy curses.COLOR_GREEN. A vlasztsi lehetsgeink a kvetkezk: fekete (black), piros (red), green (zld), srga (yellow), kk (blue), magenta (bbor), cyan (cinkk) s white (fehr). Egyszeren, nagybetkkel rva fzzk hozz a megfelelt a curses.COLOR_-hoz s megkapjuk a sznt. Amint belltottuk a sznprt, felhasznlhatjuk a screen.addstr fggvny utols paramtereknt:
myscreen.addstr([row],[column ],[text],curses.color_pair(X) )

Itt lthatjuk az ltalunk vlasztott X sznhalmazt.

bz szn This is a test felirattal. Az elsnek zldnek feketn, a msodiknak fehren kkMentsk el a kdot (fent lt- nek, a harmadiknak bbornak hat) colortest1.py nven, majd szrke httren kellene lennie. futtassuk. Ne prblkozzunk curses programok olyan IDE-n Emlkezznk mg a Try/ belli futtatsval, mint az SPE Finally szerkezetre. Ezzel biztovagy a Dr. Python. A terminlt sthatjuk be magunkat arra az hasznljuk erre. esetre, hogy ha valami nem megfelel trtnik s a termiEgy szrke htteret kellene nlt vissza kell lltani norml kapnunk hrom sornyi, klnllapotba. Van mg egy msik

full circle magazin Python 2. ktet

2!

tartalom ^

Programozzunk Pythonban mdszer is. A Cursesben tallhat egy wrapper nev parancs. A wrapper mindent elvgez helyetted. Magtl meghvja a curses.initscr()-t, a curses. start_color()-t s a curses.endwin()-t. Egyetlen dolgot kell csak szem eltt tartani: a curses.wrappert a main fggvnyben kell meghvni. Ez viszszaadja neked a screen mutatjt. Jobbra fenn ugyanaz a program lthat, csak most a curses.wrapper hasznlatval.

14. rsz vere, melyet a jobb s bal nylbillentykkel lehet a lehull bet al mozgatni. A szkz megnyomsval lhetnk. Ha sikerl lelni a bett, mieltt az elrn a fegyvernket, akkor kapunk egy pontot. Ha nem sikerl, akkor a fegyver felrobban. Ha elvesztnk hrmat, akkor vge a jtknak. Egyszer jtk, de sok kdot kell megrni hozz.

Vgjunk is bele. Vgezzk el a kezdeti belltsokat, s hozEzzel a mdszerrel nem csak zunk ltre egy pr rutint. Kezdegyszerbb lesz a program r- jnk egy j projektet, melyet sa, de az endwin meg nem hgame1.py-nek fogunk hvni. vdsa miatt sem kell aggdni, Elszr nzzk meg a jobbra ha valami hiba merlne fel. lent lthat kdot. Gyakorlatilag minden munkt Ez a kd mg nem sokat csielvgez helyettnk. nl, de ettl fggetlenl, egy j Most, hogy mr egy csom kiindulpontot jelent szmunkalapvet dolgot megtanultunk, ra. Figyeljk meg, hogy ngy hasznljuk is fel ezeket, az eldarab init_pair sznbellt utamlt egy v tapasztalatval, stsunk van, melyeket a vletegy jtk ltrehozshoz. Mie- lenl meghatrozott sznekhez ltt belevgnnk, beszljk s a robbanshoz hasznlunk meg, hogy ez mit is takar. A j- (tdik). Most lltsunk be egytk vletlenszeren vlaszt egy kt vltozt s konstansot. Ezenagybett s mikzben a kpket az Game1 osztly __init__ erny jobb szlrl a bal szl- rutinjban fogjuk elhelyezni. re mozgatja, egy vletlen poz- Cserljk le a pass utastst a cin le fog esni a kperny alj- kvetkez oldalon lv kdra. ra. A jtkosnak lesz egy fegyfull circle magazin Python 2. ktet

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()

2!

tartalom ^

Mostanra mr magadtl is ki kellene tudnod tallni, hogy ezekben a defincikban mi trtnik. Ha nem vagyunk biztosak magunkban, akkor meggrem, hogy mikzben kitltjk, minden megvilgosodik szmunkra. Lassan kapunk egy mkd kdot. Ennek ellenre mg mindig ltre kell hoznunk egy pr metdust, mieltt valamire hasznlhatnnk is. Nzzk meg a bett jobbrl balra mozgat rutint: http://fullcirclemagazine.pastebin. com/z5CgMAgm Ez lesz a leghosszabb az egsz programban, s tallkozhatunk egy-kt j fggvnnyel is. A

Programozzunk Pythonban 14. rsz


# 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

scr.delch() metdussal trljk a karaktert az adott sor|oszlopban. A curses.napms() megmondja a pythonnak, hogy vrjon X ezredmsodpercet (ms). A rutin logikjt (pszeudokdban) a kvetkez oldalon (jobbra fenn) figyelhetjk meg.

Most mr kpesnek kell lenned a kd vgigkvetsre. Kt fggvnyre van csak szksgnk a helyes mkdshez. Az els az Explode, amit egyelre a pass utastssal tltnk ki, a

msodik a ResetForNew. Ezzel az aktulis sort, illetve oszlopot lltjuk vissza alaprtelmezettre, belltjuk a DropLetter kapcsolt 0-ra, vlasztunk egy vletlen bett s megjelensi pontot. A kvetkez oldalon kzpen jobbra lthatak. Mg tovbbi ngy fggvnyfull circle magazin Python 2. ktet

re van szksgnk (kvetkez oldal, jobbra lenn). Az els kivlaszt egy vletlen bett, a msodik pedig egy vletlen megjelensi pontot. Emlksznk mg, hogy volt a cikksorozat elejn a random modulrl sz? A PickALetterben 65 s 90 kztt generlunk egy szmot

(A-tl Z-ig). Emlkezznk arra, hogy vletlen egsz generlsakor meg kell adnunk egy minimum s maximum szmprt. Ugyanez ll a PickDropPoint esetben is. A random.seed()et is meghvjuk mindkettben, ami minden alkalommal inicializlja a vletlenszm genertort. A negyedik rutint
tartalom ^

29

Programozzunk Pythonban 14. rsz IF we have waited the correct number of loops THEN CheckKeys-nek hvjk. Ebben Reset the loop counter brmilyen, a felhasznl ltal IF we are moving to the left of the screen THEN megnyomott billentyt figyeDelete the character at the the current row,column. lnk, s megfelelen lekezeljk Sleep for 50 milliseconds IF the current column is greater than 2 THEN a fegyver mozgatst. Ezt Decrement the current column egyelre megratlanul hagyjuk. Set the character at the current row,column Szksgnk lesz mg egy IF the current column is at the random column to drop CheckForHit nev metdusra, Set the DroppingLetter flag to 1 ELSE melyet ismt csak pass-szel Delete the character at the current row,column tltnk ki. Sleep for 50 milliseconds
def CheckKeys(self,scrn,keyin): pass def CheckForHit(self,scrn): pass

to the bottom THEN

Ltre fogunk hozni egy aprcska rutint, ez lesz a jtk agya. Ezt GameLoopnak fogjuk hvni (kvetkez oldalon, jobbra fenn). Itt a mgttes logika az, hogy elszr a billentyzetet nodelay(1)-re lltjuk. Ez azt jelenti, hogy nem vrunk billenty kombincikra, s ha mgis kapunk egyet, akkor egyszeren eltroljuk ksbbi feldolgozs cljbl. Ezt kveten belpnk egy while ciklusba, mely mindig igaz (1), gy a jtk addig fog tartani, amg gy nem dntnk, hogy vgeztnk. 40 ezredmsodpercig vrunk, majd elmozdtjuk a bett s el-

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.

lenrizzk, hogy a felhasznl megnyomott-e egy gombot. Ha ez egy Q (nagybets), vagy az ESC gomb, akkor megszaktjuk a ciklust s kilpnk a programbl. Egybknt leellenrizzk, hogy a megnyomott gomb jobb, vagy bal nyl, esetleg szkz-e. Ksbb gy nehezthetjk a jtkot, hogy csak akkor lhetnk, ha az aktulis karakternek megfelel billentyt nyomtuk le (akrcsak egy egyszer, gpelst tant programban). Csak nehogy elfeledjk a Q-t kivenni (a kilps gombot). full circle magazin Python 2. ktet

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)

30

tartalom ^

Programozzunk Pythonban 14. rsz Egy olyan fggvnyt is ltre Itt a jtk mr tud vlasztani kell hoznunk, ami az j jtkokat egy nagybett, azt jobbrl balelkszti. Legyen ennek neve ra, majd lefel mozgatni a kpNewGame (jobbra kzpen). ernyn. Ennek ellenre szrevehetjk, hogy brmennyiszer Szksgnk van mg egy rutin- is futtatjuk a programot, az els ra (PrintScore), ami kiratja az ak- bet mindig A s a megjeletulis pontszmot s a maradk ns helye mindig a 10. oszlop. letet (jobbra lenn). Ez azrt van, mert az __init__ rutinban megadtunk alaprtelMost mr csak egy pici kd mezett rtkeket. Ezt gy tudmaradt htra (balra lenn) a main juk kikszblni, hogy egyszefggvnyben, mely elindtja a jren meghvjuk a self.ResetFortk ciklust. Tovbbi kd lenn ltNew metdust, mieltt belphat. Helyezzk el ezt az utols nnk a main while ciklusba.
init_pair hvs utn. Vgre van egy olyan programunk, ami csinl is valamit. Prbld ki, megvrlak.

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'

Ezen a ponton mg dolgoznunk kell egy kicsit a fegyvernkn s a tbbi segdfggvnyen. Helyezzk el a kdot

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)

full circle magazin Python 2. ktet

31

tartalom ^

Programozzunk Pythonban 14. rsz (jobbra fenn) a Game1 osztly- sgi szint vltoztatshoz a ban. LetterWaitCount-tal babrlhatunk egy kicsit. Hasznlhatjuk A Movegun lekrdezi a fegyver mg a CurrentColort vletlen aktulis pozcijt s elmozdtja a sznvlasztshoz s a bet szmegadott irnyba. Az egyetlen do- nnek a ngy sznpr valamelog, ami j, az a vgn lv addch lyikhez val vletlen hozzrenrutin. Meghvjuk a colorpair(2)-t a delshez.
szn belltshoz, majd ugyanitt utastjuk a fegyvert, hogy flkvr legyen. Ehhez a bitenknti VAGY-ot (|) hasznljuk. Ezutn meg kell rnunk a CheckKeys rutint. Cserljk le a pass utastst a kvetkez oldalon, jobbra lent lv kdra.

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)

Mg kell egy rutin, ami a lvedket felfel mozgatja a kpernyn (balra lenn).

Szksgnk van mg pr fggvnyre (kvetkez oldal, jobbra fenn), mieltt befejezettnek minsthetnnk a programot. Itt tallhat a CheckForHit s az ExplodeBullet kdja. Gondolj gy erre, mint egy kis hzi feladatra. Vgl, megrjuk az Explode rutint. Helyettestsk a pass-t a Remlem lvezted az e havi kvetkez kddal (kvetkez cikket s ki fogod egy kicsit oldal, lenn). bvteni a programot, hogy mg jtszhatbb legyen. Ez mr a ksz program. A betk sebessgnek lasstshoz/gyorstshoz s a nehzfull circle magazin Python 2. ktet

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 scrn.addch(self.BulletRow,self.BulletColumn,"|") else: self.CheckForHit(scrn) scrn.addch(self.BulletRow,self.BulletColumn," ") self.BulletRow = self.GunLine 1 self.Shooting = 0

32

tartalom ^

Programozzunk Pythonban 14. rsz


Mint mindig, a teljes kd a www.thedesignatedgeek.com, vagy a: http://fullcirclemagazine.pastebi n.com/DeReeh8m cmen rhet el.
Greg Walters a RainyDay Solutions
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)

Kft. tulajdonosa, amely egy tancsad cg Aurorban, Coloradban, Greg pedig 1 972 ta foglalkozik programozssal. Szeret fzni, trzni, zent hallgatni, valamint a csaldjval tlteni a szabadidejt.

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()

full circle magazin Python 2. ktet

33

tartalom ^

Hogyanok
rta: Greg Walters

Programozzunk Pythonban - 1 5. rsz


#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 Background = 208, 202, 104

hnapban elkezdjk a Pygame modul felfedezst, melyet kifejezetten jtkok rsra talltak ki. A weblapja: http://www.pygame.org/. Kapsbl idznk is a Pygame readme-jbl: A Pygame egy platformfggetlen program modul, ami olyan multimdis szoftverek Pythonban val egyszerstett megrsra szolgl, mint pldul a videojtkok is. A Pygame-hez szksgnk van a Python nyelvre, illetve tovbbi kzismert programozsi knyvtrakra. A Pygame-et a Synapticon keresztl a python-pygame nven telepthetjk. Ezt tegyk is meg. Elszr beimportljuk a Pygame-et (lsd jobbra fenn), majd belltjuk az os.environ vltozt az ablakunk kzpre pozcionlshoz. Ezt kveten inicializljuk a Pygame ablakot 800x600 pixeles felbontsra, illetve belltjuk a cmsort. Vgl megjelentnk mindent s

belpnk egy olyan ciklusba, ami egy billenty, vagy az egr megnyomsra vr. A screen egy olyan objektum, ami minden ltalunk felhasznlt elemet trol. Ezt felletnek (surface) nevezzk. Gondoljunk erre gy, mint egy darab paprra, amelyre rajzolni akarunk. Idig nem tl izgalmas, de kezdetnek ez is megteszi. Dobjuk fel egy kicsit. A httrsznt lltsuk valamilyen kevsb stt sznre. Talltam egy colorname nevezet programot, amit az Ubuntu Szoftverkzponton keresztl fel tudunk telepteni. Segtsgvel kivlaszthatunk egy sznt egy sznkerken, s meg fogja adni ennek RGB - azaz piros, zld s kk rtkt. Ha nem szeretnnk az elredefinilt Pygame-es sznekkel dolgozni, akkor mindenkppen RGB szneket kell hasznlnunk. Ez egy gyes kis segdprogram, mely hasznunkra vlhat. Kzvetlenl az import utastsok al helyezzk el a
full circle magazin Python 2. ktet

sort. Ezzel belltjuk a Backgroundot egy cser sznre. Kvetkeznek a pygame.display Most a kellemes kinzet .set_caption sor utn rjuk be az ablakunkban meg fogunk jelealbbiakat: nteni egy szveget. Ismt az import utastsainkkal s a htscreen.fill(Background) trvltozk belltsval kezpygame.display.update() dnk: A screen.fill() metdus a import pygame megadott rtkre lltja a htfrom pygame.locals import * trsznt. A kvetkez sor, a import os pygame.display.update() pedig Background = 208, 202, 104 a kpernyn aktualizlja a vlrjuk meg a bettpus eltr toztatsokat.

Mentsk el a programot pygame1 . py nven s lpjnk tovbb.

34

tartalom ^

sznt is:

Programozzunk Pythonban - 1 5. rsz

FontForeground = 255,255,255 # White

re, a mretet pedig 27 pontra lltjuk. A kvetkez a font.render() metdus. Ennek ngy darab argumentuma van, melyek rendre: a megjelentend szveg, akarunk-e lsimtst hasznlni (ebben az esetben True, azaz igen), vgl a bet eltr s httr szne.

Ezutn az elz kdot nagyrszt temeljk (jobbra) .

Ha most futtatjuk, akkor a klalakon semmi vltozst nem fogunk tapasztalni, mivel kizrlag az eltr sznt vltoztattuk meg. rjuk be az albbi kA kvetkez sor (text.get_ dot a screen.fill() sor s a ciklus rect()) lekr egy befoglal tgkz: lalap objektumot, amivel majd kirakjuk a szveget a kpernyfont = re. Ez egy fontos lps, mivel pygame.font.Font(None,27) text = font.render('Here is szinte minden ms dolog is tgsome text', True, lalapokkal lesz elintzve. (Kicsit FontForeground, Background) ksbb vilgosabb lesz.) Ezutn textrect = text.get_rect() blitteljk a tglalapot a kijelzscreen.blit(text,textrect) pygame.display.update() re, vgl frisstnk a szveg megjelentshez. Na de mi az Mentsnk pygame2.py na blit s mirt akarnnk ilyen ven s futtassuk. Az ablakunk furcsa nev dolgot hasznlni? bal fels sarkban lthatjuk a Nos, a kifejezs keletkezse Here is some text feliratot. egszen a '70-es vekig nylik vissza, s a Xerox PARC-tl jtt Egyenknt nzzk meg az j (aminek sok, ma hasznlt techparancsokat. Elszr a Font me- nolgit ksznhetnk). Eredetdust hvjuk, melynek kt artileg BitBLT volt, ami a Bit (vagy gumentumot adunk t. Az els bittrkp) Block Transfer rvida betkszlet neve, a msodik tse. Ebbl lett ksbb a Blit a betmret. Egyelre a 'None' (mert gy sokkal rvidebb). kulcssz hasznlatval a tpus- Gyakorlatilag a kpeket s szvlasztst rbzzuk a rendszer- vegeket a kpernyre dobjuk. full circle magazin Python 2. ktet

# 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

De mi van akkor, ha a szvegnket a kperny kzepre akarnnk igaztani, az els sor helyett, ahol nem annyira van szem eltt? A text.get_rect() s a screen.blit kztt helyezzk el az albbi kt sort:
textRect.centerx = screen.get_rect().centerx textRect.centery = screen.get_rect().centery

veg, mely a sajt felletn helyezkedik el. A szveget a font.set_bold(True) s/vagy font.set_italic(True) (ebben a pldakdban) pygame.font.Font sor utni elhelyezsvel lehet mdostani. Idzzk fel, hogy amikor egy beptett bettpust lltottunk be, a None-t csak igen rviden trgyaltuk. Tegyk fel, hogy mi egy valamivel rdekesebb tpust szeretnnk hasznlni. Mint mr elbb is mondtam, a pygame.font.Font() metdusnak kt argumentuma van. Az els az elrsi tja s a betkszlet fjl neve, a msodik a bet mrete. A problma, melytartalom ^

Itt szmoljuk ki, hogy hova kell helyezni az objektumot (ami egy fellet), majd a textRect x s y rtkt ennek megfelelen lltjuk be. Futtassuk le a programot. Most mr kzpen van a sz-

35

be beletkznk tbbrteg. Hogyan hatrozzuk meg annak a bettpusnak a tnyleges elrsi tjt s fjlnevt, melyet egy adott rendszeren hasznlni szeretnnk? Szerencsre rendelkezik a Pygame egy olyan fggvnnyel, ami mindezt elintzi helyettnk, match_font a neve. Itt van egy rvidke kis program, ami kiratja az elrsi tjt s fjlnevt (ebben az esetben) a Courier New tpusnak:

Programozzunk Pythonban - 1 5. rsz

Vltoztassuk meg a programot gy, hogy tartalmazza ezeket a sorokat, s futtassuk jra. A lnyeg, hogy vagy egy olyan bettpust hasznlunk, amirl TUDJUK, hogy megtallhat a felhasznl rendszern, vagy mellkeljk azt a programhoz s belekdoljuk az elrsi utat. Ms megoldsok is lehetsgesek, de a megtallsukat meghagyom szmotokra, s most tovbb lpnk.

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)

import pygame from pygame.locals import * import os print pygame.font.match_font('Couri er New')

Az n rendszeremen a /usr /share/fonts/truetype/msttcoref onts/cour.ttf volt a visszaadott rtk. Abban az esetben, ha a bettpus nincs meg, ennek rtke None. Ha viszont meglett, akkor ezt az rtket egy vltozhoz rendelhetjk s hasznlhatjuk az albbi kifejezst:
courier = pygame.font.match_font('Couri er New') font = pygame.font.Font(courier,27)

nyl billentykre feltve, ha nem az ablak szln vagyunk. Az is j lenne, ha a program kilpne a q billenty megnyomsra. Nos, a sprite mozgatMindez szp s j, de grafisa knnynek hangzik, s az is, kkkal mg szebb lenne. Tallde taln mgsem annyira, tam egy igen j tutorialt, meamennyire szeretnnk. Kt tglyet Peyton McCollugh rt a Pylalap ltrehozsval kezdnk. game-hez s gy dntttem, Tudom, nem vaAz els mag a sprite-, a mhogy egy kicsit mdostom. gyok egy mvsz. sodik pedig egy ugyanakkora, Szksgnk lesz egy kpre, ami Ennek ellenre j de res kp. Blitteljk a spritemszklni fog a htternkn. lesz arra, amire hiva- ot, majd amikor a felhasznl Ezt a fajta kpet sprite-nak ne- tott. Png-knt mentettk, majd megnyom egy gombot, az res vezzk. Hasznljuk a GIMP-et a htteret tltszra lltottuk tglalapot rblitteljk a spritevagy valamilyen ms hasonl ahhoz, hogy csak a kis fekete ra, kiszmtjuk az j pozcit s eszkzt egy plcikaember elk- vonalak legyenek majd lthat- visszablitteljk azt az j pozicisztshez. Nem kell nagyon ak s nem egy fehr vagy ba. Gyakorlatilag hasonlt csiszpet kszteni, egy tlagos msmilyen httr. nlunk, mint mltkor az bcs plcikaember is megteszi. Azt jtkban. s ennyi az egsz alfogom felttelezni, hogy GIMPBeszljnk most arrl, hogy kalmazs. Arra elg lesz, hogy el dolgozunk. Ksztsnk egy j mit fog a programunk csinlni. megrtsk egy kp kirajzolst kpet, mely 50x50 pixel mret Egy olyan Pygame ablakot aka- s mozgatst. s az advanced options alatt runk megjelenteni, ami tartallltsuk a Fill With opcit mazza a plcikaembert. Ezen Teht, hozzunk ltre egy j Transparency-re. Hasznljuk a fell szeretnnk, ha mozogna a programot s nevezzk el
full circle magazin Python 2. ktet

ceruza eszkzt egy Circle(03)as ecsettel. Rajzoljuk meg a kis figurnkat s mentsk ugyanabba a mappba, stick.pngknt, amelyben a kdjaink vannak. Itt van az enym is. Biztosan jobbat is ltre tudntok hozni.

36

tartalom ^

Programozzunk Pythonban - 1 5. rsz


pygame4.py-nek. Helyezzk el az include-okat, amiket ebben a cikkben hasznltunk. Ez alkalommal egy menta zld htternk lesz, azaz a sznrtkek 0, 255 s 127 (lsd elz oldalon).

Itt ltrehozunk egy pldnyt az osztlyunkbl, amit characAz update rutin gyakorlatilag ter-nek hvunk. Ezt kveten csak a sprite-rl kszt egy m- blitteljk a sprite-ot. LtrehozEzutn ltrehozunk egy oszsolatot, majd leellenrzi, hogy tlyt, ami lekezeli a grafikt zuk az res sprite tglalapot s leesne-e a kpernyrl. Ha vagy a sprite-ot (itt lenn). Ezt kitltjk a httrsznnel, majd igen, akkor bkn hagyja, kkzvetlenl az importok utn frisstjk a felletnket s bellnben elmozdtja a megadott szrjuk be. pnk a ciklusba. mrtkkel. Mit csinl ez az egsz? Nos, Addig, amg a DoLoop 1-el egyenl, a ciklusban maradunk. class Sprite(pygame.sprite.Sprite): A pygame.event.get()-et haszdef __init__(self, position): nljuk a karakterek beolvasspygame.sprite.Sprite.__init__(self) # Save a copy of the screen's rectangle hoz. Ezutn az esemny tpusself.screen = pygame.display.get_surface().get_rect() hoz prostjuk ket. Ha ez QUIT, # Create a variable to store the previous position of the sprite akkor kilpnk. Ha KEYDOWN, self.oldsprite = (0, 0, 0, 0) akkor feldolgozzuk. Megnzzk self.image = pygame.image.load('stick3.png') self.rect = self.image.get_rect() a kapott karakter rtkt s self.rect.x = position[0] sszehasonltjuk a Pygame-ben self.rect.y = position[1] definilt konstansokkal. Ezutn meghvjuk az osztlyunk updef update(self, amount): # Make a copy of the current rectangle for use in erasing date rutinjt. Figyeljk meg, self.oldsprite = self.rect hogy egyszeren tovbbadjuk a # Move the rectangle by the specified amount pixelek x- s y-tengelyen val self.rect = self.rect.move(amount) elmozdulsainak listjt. Tz # Check to see if we are off the screen if self.rect.x < 0: pixellel tltjk fel (pozitvokkal self.rect.x = 0 jobb vagy le esetben, negatelif self.rect.x > (self.screen.width self.rect.width): vokkal balra s fel esetben). Ha self.rect.x = self.screen.width self.rect.width a karakter q-val egyenl, akif self.rect.y < 0: self.rect.y = 0 kor a DoLoopot 0-ra lltjuk, gy elif self.rect.y > (self.screen.height self.rect.height): lpvn ki a ciklusbl. Kizrlag self.rect.y = self.screen.height self.rect.height ezek utn blitteljk a spritefull circle magazin Python 2. ktet 3! tartalom ^

kezdjk az __init__ rutinnal. A Pygame sprite moduljt a pygame.sprte.Sprite.__init__ sorral inicializljuk. Ezutn belltjuk a felletet, melyet screennek (kperny) neveznk. Ezzel majd meg tudjuk nzni, hogy a sprite lemegy-e a kpernyrl. Majd ltrehozzuk s belltjuk az res oldsprite vltozt, melynek a fjl nevt (s elrsi tjt, ha az nem a program mappjban van) adjuk t. Ezutn kapunk egy referencit a sprite-

hoz (self.rect), ami automatikusan belltja a tglalap szlessgt s magassgt, illetve az x s y pozciit a megadott rtkekre.

A screen.fill utasts utn helyezzk el a kvetkez oldalon (jobbra) lthat kdot.

Programozzunk Pythonban - 1 5. rsz


unkat az j pozciba s frisstnk de ebben az esetben csak a kt tglalapot, az res s aktv sprite-okat, gy temrdek idt s szmtsi kapacitst takartunk meg. Mint mindig, a teljes kd a www.thedesignatedgeek.com oldalon, vagy a http://fullcirclemagazine.pasteb in.com/DvSpZbaj cmen rhet el. Sok minden van mg, amit a Pygame-el meg tudunk oldani. Azt javaslom, hogy ltogassuk meg a honlapjukat s keressk meg a referenciaoldalt (http://www.pygame.org/docs/r ef/index.html). Ezen fell mg msok ltal ksztett jtkokat is megtekinthetnk.
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])

Greg Walters a RainyDay Solutions

Kft. tulajdonosa, amely egy tancsad cg Aurorban, Coloradban, Greg pedig 1 972 ta foglalkozik programozssal. Szeret fzni, trzni, zent hallgatni, valamint a csaldjval tlteni a szabadidejt.

Kvetkez alkalommal egy rgi jtkommal picit mlyebbre sunk a Pygame-ben. Egy NAGYON rgi jtkommal.
full circle magazin Python 2. ktet

3!

tartalom ^

H o g ya n o k
rta: Greg Walters

P ro g ra m o z z u n k P yt h o n b a n - 1 6 . r s z
Nem egy hatalmas vltozs, de olyan, amire oda kell figyelni. Mr azzal fel tudunk kszlni a vltsra, ha ezt a szintaxist hasznljuk 2.x alatt is.

emrg meggrtem valakinek, hogy megtrgyaljuk a Python 2.x s 3.x verzii kztti klnbsgeket. Legutbb pedig azt mondtam, hogy folytatjuk pygame-es programozsunkat. Ennek ellenre gy rzem, hogy be kell tartanom az gretemet, azaz majd csak a legkzelebbi alkalommal fogunk a pygame-el foglalkozni. A Python 3.x verzijban sok vltozs trtnt. Minderrl sok informci rhet el a Weben, melyek kzl nhny linkjt a cikk vgn megtallhatjtok. Ennek ellenre sok aggodalom van a vlts krl. Most csak azokra a klnbsgekre fogunk sszpontostani, melyek kihatnak az ltalunk tanultakra.

Vgjunk is bele.

PRINT
Mr korbban is utaltam r, hogy az egyik legnagyobb klnbsg, a print utasts hasznlatban van. 2.x alatt egyszeren rhattuk az albbit:
print This is a test

Formzs s vltoz behelyettests


A formzs s a vltoz behelyettests is megvltozott. 2.x alatt a lenti pldban lthat dolgokat hasznltuk, illetve a 3.1 alatt is a megfelel eredmnyt kapjuk. Azonban ez hamarosan meg fog vltozni, mert a %s s %d formz fggvnyek el fognak tnni. Az j mdszer a {x} helyettest utastst fogja hasznlni, melyet a rgi plda alatt lthatunk. Nekem knnyebben olvas-

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

hatnak tnik. Tovbb az albbihoz hasonl dolgokat is tudunk majd csinlni:


>>> print("Hello {0}. I'm glad you are here at {1}".format("Fred","MySite.c om"))

s vgeztnk is. Ha viszont 3.x alatt prblkozunk ugyanezzel, akkor a jobbra fenn lv hibazenetet kapjuk. Ez persze nem j neknk. Ahhoz, hogy hasznlhassuk a print utastst, a kirand szveget az albbi mdon zrjelek kz kell rakni:
print(this is a test)

Hello Fred. I'm glad you are here at MySite.com >>>

>>> months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] >>> print "You selected month %s" % months[3] You selected month Apr >>> Rgi >>> 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 >>> j

Emlkezznk arra, hogy br hasznlhatjuk a %s-et s vltozatait, de ezek egy id mlva teljesen ki fognak veszni a nyelvbl.

Szmok
Python 2.x alatt, ha ezt rtuk:
x = 5/2.0
tartalom ^

full circle magazin Python 2. ktet

39

Programozzunk Pythonban - 1 6. rsz


akkor x tartalma 2.5 lett volna. De viszont az
x = 5/2

input()-ra lett cserlve. Egysze- j vltozat a ! =. ren vltoztassuk meg a sort:


response = input('Enter a selection > ')

kifejezsben a levgs miatt 2 maradt volna. 3.x alatt az:


x = 5/2

kifejezssel mr 2.5-t kapunk. A levgshoz az albbit kell hasznlni:


x = 5//2

s rendben fog mkdni.

Nem egyenl
2.x alatt az egyenltlensg tesztelsre a <> opertort hasznltuk. Ez azonban mr nem megengedett 3.x alatt. Az

Rgebbi programok konvertlsa Python 3.x al

+======================================+ | Item 1 3.00 | | Item 2 15.00 | ++ | Total 18.00 | +======================================+ Script terminated.

Input
Rgebben volt sz egy, a felhasznl vlaszait kezel, s a raw_input()-ot hasznl menrendszerrl. Valami ilyesmi volt:
response = raw_input('Enter a selection > ')

kvnt vgeredmnyhez. A konverzis programot (logikuA Python 3.x-et egy olyan segdprogrammal kapjuk, ami san) 2to3-nek nevezik. Vegynk egy egyszer prograsegt az alkalmazsok 2.x-rl 3.x-re val konvertlsban. Ez mot. A lenn tallhat plda mg rgebbrl egszen ponnem mindig mkdik, de sok tosan a 3. rszbl szrmazik. esetben kzelebb kerlnk a

#pprint1.py #Example of semiuseful functions def TopOrBottom(character,width): # width is total width of returned line return '%s%s%s' % ('+',(character * (width2)),'+') 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(leftbit2,' '),part2.rjust(rightbit2,' '), |') # 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)

Ez rendben is van 2.x alatt. Viszont 3.x alatt a kvetkezt kapjuk:


Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'raw_input' is not defined

Ez nem egy kritikus problma. A raw_input() metdus az

full circle magazin Python 2. ktet

40

tartalom ^

Programozzunk Pythonban - 1 6. rsz


Amikor 2.x alatt futtatjuk, az elz oldalon jobbra fent lv kimenetet kapjuk. De termszetesen, a 3.x-el nem fog mkdni.
File "pprint1.py", line 18 print TopOrBottom('=',40) ^ SyntaxError: invalid syntax

a vgre biggyesztem a v3at:


cp pprint1.py pprint1v3.py

A problmt a konverzis programmal prbljuk orvosolni. Mieltt belevgnnk, rdemes egy biztonsgi msolatot ltrehozni a konvertland alkalamazsrl. n ezt a fjl msolsval oldom meg, gy hogy

Tbb fajta mdszer van a program futtatsra. A legegyszerbb, ha megkerestetjk a programmal a hibkat. Ezt balra lent lthatjuk.

Figyeljk meg, hogy az eredeti forrskd nem vltozott. A vltozsok fjlba val mentshez a -w paramtert kell hasznlnunk. Ennek eredmnyt jobbra lenn talljuk. Azt is szrevehetjk, hogy a kimenetek megegyeznek. Ez alkalommal a forrsfjlunk

> 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

> 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

full circle magazin Python 2. ktet

41

tartalom ^

Programozzunk Pythonban - 1 6. rsz


viszont version 3.x compatible fjll vltozott (jobbra). A program most mr mkdik 3.x alatt is, valamint, mivel egy elg egyszer programrl van sz, a 2.x verzival is kompatibilis maradt.
#pprint1.py #Example of semiuseful functions def TopOrBottom(character,width): # width is total width of returned line return '%s%s%s' % ('+',(character * (width2)),'+') 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(leftbit2,' '),part2.rjust(rightbit2,' '),' |') # 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))

Most azonnal vltsak 3.x-re?


A legtbb problma a tbbi nyelv vltozsnl is elfordul. A szintaxis talakul minden egyes j verzival. A rvidtsek, mint += s -= a semmibl hullanak elnk, hogy megknynytsk letnket. Hogy mekkora a htrnya a 3.x-re val migrlsnak? Nos, van egy kicsi. Sok olyan fggvnyknyvtr van, ami mg 3.x al nem rhet el. Olyan dolgok, mint pldul a Mutagen melyet nhny szmmal korbban mr hasznltunk sem hasznlhat mg. Annak ellenre, hogy mindezek fogs rvek, nem jelentik azt, hogy fel kell adnunk a Python v3.xet. Az n javaslatom az lenne, hogy kezdjnk el a helyes 3.xs szintaxissal kdolni. A Python 2.6 tmogat majdnem

minden olyan dolgot, melyet 3.x-ben hasznlnnk. Ezzel a mdszerrel kszen fogunk llni a 3.x-re val vltshoz, amikor annak el fog jnni az ideje. Ha viszont meg tudunk lenni a szabvnyos modulokkal, akkor akr bele is vghatunk. Msrszt, ha a hatrokat akarnnk feszegetni, rdemes addig vrni, amg a modulok fel nem zrkznak (mert biztosan fel fognak). Lentebb pr linket tallunk, amikrl gy gondoltam, hogy hasznosak lehetnek. A legels a 2to3 hasznlati tmutatja. A
full circle magazin Python 2. ktet

msodik egy 4 oldalas puska, amit elg j referencinak talltam. A harmadik pedig egy olyan knyv a Pythonrl, amit a legjobbnak tartok. (Legalbbis addig, amg meg nem rom a sajtomat.) Tallkozzunk legkzelebb is!

http://docs.python.org/library/2 to3.html Moving from Python 2 to Python 3 (A 4 oldalas puska) http://ptgmedia.pearsoncmg.co m/imprint_downloads/informit/ promotions/python/python2pyt hon3.pdf Dive into Python 3 http://diveintopython3.org/

Linkek
A 2to3 hasznlata:

42

tartalom ^

K z re m k d n l ?
Az olvaskznsgtl folyamatosan vrjuk a magazinban megjelentend j cikkeket! Tovbbi informcikat a cikkek irnyvonalairl, tletekrl s a kiadsok fordtsairl a http://wiki.ubuntu.com/UbuntuMagazine wiki oldalunkon olvashatsz. Cikkeidet az albbi cmre vrjuk: articles@fullcirclemagazine.org A magyar fordtcsapat wiki oldalt itt tallod: https://wiki.ubuntu.com/UbuntuMagazine/TranslateFullCircle/Hungarian A magazin eddig megjelent magyar fordtsait innen tltheted le: http://www.fullcircle.hu Ha email-t akarsz rni a magyar fordtcsapatnak, akkor erre a cmre kldd: fullcirclehu@gmail.com
Ha hrt szeretnl kzlni, megteheted a kvetkez cmen: news@fullcirclemagazine.org

A Full Circle Csapata


Szerkeszt - Ronnie Tucker
ronnie@fullcirclemagazine.org Webmester - Rob Kerfia admin@fullcirclemagazine.org Kommunikcis felels - Robert Clipsham mrmonday@fullcirclemagazine.org Podcast - Robert Catling podcast@fullcirclemagazine.org
Full Circle Magazin Magyar Fordtcsapat Koordintor:
Prcsy Kornl Palots Anna Kovcs Roland Attila Tmskzi Mt Ferenc

Fordtk:

Vlemnyed s Linuxos tapasztalataidat ide kldd: letters@fullcirclemagazine.org


Hardver s szoftver elemzseket ide kldhetsz: reviews@fullcirclemagazine.org

Szerkeszt, korrektor:
Heim Tibor Ksznet a Canonical-nek s a fordtcsapatoknak vilgszerte, tovbb Thorsten Wilms-nek a jelenlegi Full Circle logrt.

Krdseket a Krdsek s Vlaszok rovatba ide kldd: questions@fullcirclemagazine.org Az n asztalom kpeit ide kldd: misc@fullcirclemagazine.org
... vagy ltogasd meg frumunkat: www.fullcirclemagazine.org

A FULL CIRCLE-NEK SZKSGE VAN RD!

Egy magazin, ahogy a Full Circle is, nem magazin cikkek nlkl. Ossztok meg velnk vlemnyeiteket, desktopjaitok kinzett s trtneteiteket. Szksgnk van a Fkuszban rovathoz jtkok, programok s hardverek ttekint lersra, a Hogyanok rovatban szerepl cikkekre (K/X/Ubuntu tmval), ezenkvl, ha brmilyen krds, javaslat merl fel bennetek, nyugodtan kldjtek a kvetkez cmre: articles@fullcirclemagazine.org full circle magazin Python 2. ktet

43

tartalom ^

Potrebbero piacerti anche

  • Issue69 Hu
    Issue69 Hu
    Documento48 pagine
    Issue69 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue57 Hu
    Issue57 Hu
    Documento54 pagine
    Issue57 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue71 Hu
    Issue71 Hu
    Documento55 pagine
    Issue71 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue70 Hu
    Issue70 Hu
    Documento50 pagine
    Issue70 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue55 Hu
    Issue55 Hu
    Documento59 pagine
    Issue55 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue61 Hu
    Issue61 Hu
    Documento57 pagine
    Issue61 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue66 Hu
    Issue66 Hu
    Documento60 pagine
    Issue66 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue68 Hu
    Issue68 Hu
    Documento64 pagine
    Issue68 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue67 Hu
    Issue67 Hu
    Documento66 pagine
    Issue67 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue60 Hu
    Issue60 Hu
    Documento56 pagine
    Issue60 Hu
    Blind Man
    Nessuna valutazione finora
  • IssuePY01 Hu
    IssuePY01 Hu
    Documento43 pagine
    IssuePY01 Hu
    Blind Man
    Nessuna valutazione finora
  • Adobe Illustrator CS3 - Tanfolyam A Könyvben
    Adobe Illustrator CS3 - Tanfolyam A Könyvben
    Documento408 pagine
    Adobe Illustrator CS3 - Tanfolyam A Könyvben
    Blind Man
    Nessuna valutazione finora
  • Full Circle
    Full Circle
    Documento59 pagine
    Full Circle
    Brandon Erickson
    Nessuna valutazione finora
  • Issue63 Hu
    Issue63 Hu
    Documento58 pagine
    Issue63 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue59 Hu
    Issue59 Hu
    Documento53 pagine
    Issue59 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue58 Hu
    Issue58 Hu
    Documento48 pagine
    Issue58 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue52 Hu
    Issue52 Hu
    Documento55 pagine
    Issue52 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue54 Hu
    Issue54 Hu
    Documento43 pagine
    Issue54 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue53 Hu
    Issue53 Hu
    Documento51 pagine
    Issue53 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue51 Hu
    Issue51 Hu
    Documento47 pagine
    Issue51 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue56 Hu
    Issue56 Hu
    Documento54 pagine
    Issue56 Hu
    Blind Man
    Nessuna valutazione finora
  • Web Programozas Alapismeretek - Szines
    Web Programozas Alapismeretek - Szines
    Documento287 pagine
    Web Programozas Alapismeretek - Szines
    Szabina Mogyorósi
    100% (1)
  • Issue50 Hu
    Issue50 Hu
    Documento53 pagine
    Issue50 Hu
    Blind Man
    Nessuna valutazione finora
  • Nagy E-Szignó Könyv
    Nagy E-Szignó Könyv
    Documento518 pagine
    Nagy E-Szignó Könyv
    Blind Man
    Nessuna valutazione finora
  • Issue49 Hu
    Issue49 Hu
    Documento49 pagine
    Issue49 Hu
    Blind Man
    Nessuna valutazione finora
  • Issue48 Hu
    Issue48 Hu
    Documento46 pagine
    Issue48 Hu
    Blind Man
    Nessuna valutazione finora
  • Full Circle Issue 46
    Full Circle Issue 46
    Documento37 pagine
    Full Circle Issue 46
    richardb882
    Nessuna valutazione finora
  • Issue45 Hu
    Issue45 Hu
    Documento35 pagine
    Issue45 Hu
    Blind Man
    Nessuna valutazione finora
  • Full Circle Issue 47
    Full Circle Issue 47
    Documento42 pagine
    Full Circle Issue 47
    richardb882
    Nessuna valutazione finora