Képek

2019.11.13

GIF és PNG képek beolvasása és kirajzolása

A programjainkban eddig téglalapokból, körökből és vonalakból rajzoltunk ábrákat. A tkinter modul segítségével használhatunk gif és png képeket is.

Innen letölthetőek a képek, amelyekkel ebben a fejezetben dolgozunk.

Először létrehozunk egy speciális változót, amelybe beolvassuk a képet:

valtozo = tkinter.PhotoImage(file='fajl_neve')

A kép még sehol nem jelenik meg, csak létrejön a változó, a Python emlékezni fog rá. Ha csak a kép nevét adjuk meg a kiterjesztéssel, akkor a Python ugyanabban a mappában fogja keresni, ahova a programunkat mentettük. Ha ott nem találja, hibát jelez. A fájl nevéhez megadhatjuk az egész elérési útvonalat, vagy a relatív utat a képhez.

kep = tkinter.PhotoImage(file='kepek/beka1.png')

A képet most elhelyezhetjük a vászonra:

canvas.create_image(50, 50, image=kep)

Az alábbi program a klikkelés helyére kirajzolja a beolvasott képet.

Jegyezzük meg,  hogy a canvas.create_image utasítással nem lenyomatot készítünk a vászonra. A kép a változó megjelnítése. Vagyis, ha időközben a kep változónk értéke megváltozik, akkor az addig megjelenített ábrák eltűnnek. Ezért a kep változónknak globálisnak kell lennie.

Módosítsuk a programot, hogy a jobb egérgombra reagálva a beka2.gif ábra jelenjen meg.

Láthatjuk, hogy a klikkelés helye a kép közepe. Néha azonban arra van szükség, hogy a klikkelés helye a kép bal felső sarka legyen. Ekkor elég megadni az anchor paramétert 'nw' (northwest) értékkel. Hasonlóan működik más pontokkal is.

canvas.create_image(x, y, image = kep, anchor = 'nw')

Az anchor paraméter hasonlóan használhatjuk a canvas.create_text utasításban is.

Képek listája

A kocka_1.png, kocka_2.png, kocka_3.png, kocka_4.png, kocka_5.png, kocka_6.png fájlokban egy dobókocka képei vannak az egyes értékekkel (1-6).

Ezeket a képeket a következőképpen olvastathatjuk be:

A képeket itt egy ciklus segítségével olvastuk be. Ideiglenesen egy lokális változóba hoztuk létre, de azt egy globális listához adtuk. Így nem lesz vele gond a program során.

Nézd meg az alábbi programot. Mit csinál? Hogyan működik?

Időjárásjelentés vizualizációja

Egy időjárás előrejelző cégben szeretnének egy programot, amely vizuálisan megjeleníti az előrejelzést.

A szlovakia.png fájlban található Szlovákia vaktérképe.

Az időjárást jelző képek a következők: derus.png, napos.png, felhos.png, borus.png, eso.png, havazas.png és vihar.png.

A programban először az üres térkép jelenik meg. A jobb felső sarokban az éppen aktuális időjárás jelzése látható, amit egérrel elhelyezünk a térképen. A térkép alatt beírjuk az előrejelzett hőmérsékletet. Az alsó határt írjuk be, a felsőt a gép generálja - 4 fokkal több.

A program a beadott információkat egy szöveges dokumentumba menti. A cég ezt a fájlt küldi tovább a tévéknek, akik az adatok alapján vizualizálni tudják az előrejelzést. Ha a szerkesztésnél megtévedünk, akkor a szóköz lenyomásával elölről kezdhetjük. Az addigi adatok törlődnek.

Létrehozunk kettő vásznat. Az egyikben lesz Szlovákia térképe az elhelyezett ikonokkal. A másikban (jobbra fent) az időjárást jelző képecske, amit el fogunk helyezni a térképen. Ennek a vászonnak a megjelenítésére a pack() helyett a place() utasítást fogjuk használni, amelyben megadjuk a vászon koordinátáit az egész ablakra nézve. Az első vászonra kirajzoljuk a térképet. A beolvasás után megállapítjuk a kép méreteit és ahhot igazítjuk a vászon méreteit is. Az időjárást jelző ikonokat beolvassuk egy listába.

Elhelyezzük az entry-t, ahova kezdetben egy 0 van írva. Amikor az első vászonra kattintunk, azzal elhelyezzük ott a kiválasztott ikont. Az entry-ből beolvassuk az értéket, ebből kiszámoljuk az alsó és felső hőmérsékletet. Ezeket kiíratjuk az elhelyezett ikon alá. Ezzel egyidőben megnyitjuk a szöveges dokumentumot, ahova az adatokat mentjük és beírjuk a koordinátákat, időjárás megnevezését és az alsó hőmérsékletet. Ezután a fájlt bezárjuk.

Amikor a második vászonra kattintunk, növeljük az aktualis változó értékét. Ha több lenne, mint a képek száma, akkor visszaállítjuk 0-ra. Így változik a kis ikon is a canvas2-ben.

Amikor lenyomjuk a szóközt, akkor a szöveges dokumentumunk megnyílíd írásra, és be is zárul - ezzel töröljük a tartalmát. A már elhelyezett ikonokat a térképről szintén töröljük az 'elorejelzes' taggal.

Ezzel elkészült az előrejelző szerkesztőnk. Most megcsináljuk azt a programot, ami a szöveges dokumentumból vizualizálni tudja az előrejelzést. A programba beépítünk animációt is a megjelenésre és az eltűnésre. Ezeket az egér gombjaival fogjuk irányítani.

Most jöhet az animáció. A program reagálni fog az egér bal és jobb gombjára, a különbség csupán az irány lesz.

Feldatok

1. Módosítsd az előrejelző programot (második) úgy, hogy egymás után három előrejelzsét is meg tudjon jeleníteni az elorejelzes1.txt, elorejelzes2.txt és elorezeljez3.txt fájlokból.

2.Módosítsd mindkét programot úgy, hogy a dátumot is el lehessen menteni. A vizualizációnál ez jelenjen meg. Ezután a három fájlból a következő három napra is meg lehet jeleníteni az előrejelzést.


Lambda függvények

Észrevehettétek, hogy a balra() és jobbra() függvények szinte egyformák, csak az irany változó értékében különböznek. Ezeket akár egyesíthetjük is, akkor egy eljárásunk lenne és paraméterként adnánk meg az irany értékét. A probléma viszont az, hogy a bind utasítás nem engedi az eljárásoknak saját paraméter használatát. Ilyen esetekre szolgál egy speciális, úgynevezett lambda függvény. Ez egy úgynevezett anoním függvény - nem kell a def segítségével definiálni. Az ilyen függvényben csupán egy sor van, és nincs return.

Nézzünk egy példát:

def hatvany(x, y):
       return x ** y

print(hatvany(2, 3))

Lambda függvénnyel ugyanez:

hatvany = lambda x, y: x ** y
print(hatvany(2, 3))

Vagyis a lambda függvény általános alakja: lambda paraméter: kifejezés.

Létrehozunk egy függvényt a mozgatásra: mozogj()

A következő két példában is látható a lambda függvény használata. Mindkét program ugyanazt csinálja (a programban van két nyomógomb, amelyek fel/le mozgatják a kirajzolt alakzatokat), csak másképp vannak megoldva.

© 2023 Minden jog fenntartva.
Az oldalt a Webnode működteti
Készítsd el weboldaladat ingyen! Ez a weboldal a Webnode segítségével készült. Készítsd el a sajátodat ingyenesen még ma! Kezdd el