Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
tartalom ^
Full Circle
AZ UBUNTU LINUX KZSSG FGGETLEN MAGAZINJA
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.
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.
J szrakozst!
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
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
Eszkzk:
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.
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)
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
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
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:
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>
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.
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 ^
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
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
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
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
<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
15
tartalom ^
rtkkel az oldal aljn lthat. Vedd figyelembe, krlek, hogy olyan tageket vlasztottam, amelyek a Farenheit s Celsius rt-
keket is tartalmazzk. Ha pldul csak a Celsius rtkeket szeretnd megjelenteni, a <temperature_string> cmke helyett a <temp_c> cmkt is hasznlhatod.
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.
16
tartalom ^
Hogyanok
rta: Greg Walters Elz rszek:
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 ^
#================================= # 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)
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-
#================================= # 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)
Ennyi lenne mostanra. Az alert rszt meghagyom nektek, ha esetleg vgig akarntok menni rajta.
full circle magazin Python 2. ktet
20
21
tartalom ^
Hogyanok
rta: Greg Walters
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()
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()
24
tartalom ^
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
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.
26
tartalom ^
Hogyanok
rta: Greg Walters
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) )
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
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)
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
# 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
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()
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 ^
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()
33
tartalom ^
Hogyanok
rta: Greg Walters
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.
34
tartalom ^
sznt is:
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.
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:
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)
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 ^
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.
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
>>> print "This is a test" File "<stdin>", line 1 print "This is a test" ^ SyntaxError: invalid syntax >>>
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)
>>> 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 ^
39
Nem egyenl
2.x alatt az egyenltlensg tesztelsre a <> opertort hasznltuk. Ez azonban mr nem megengedett 3.x alatt. Az
+======================================+ | 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)
40
tartalom ^
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
41
tartalom ^
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
Fordtk:
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
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 ^