Táblázatos elrendezésű grafikus elemek helyének meghatározása pontkoordináták alapján

Ha grafikus felhasználói felületet készítünk, akkor felmerülhet az a kérdés, illetve feladat, hogy egy grafikus elem (widget) helyét valamihez képest meghatározzuk. A hely azonosítása általában x, y koordinátákkal történik. Ha viszont a grafikus elem táblázatos elrendezésben lett lehelyezve (a tkinter grid() metódussal), akkor a pontkoordintákkal való jellemzés helyett vagy mellett igény lehet arra, hogy meghatározzuk, hogy táblázat/rács milyen sor- és oszlopindexszel jellemzett cellájában helyezkedik el az adott grafikus elem.

A pontkoordinátákkal való helyazonosítást, attól függően, hogy mi a referencia pont, több módon is megtehetjük. Ezt foglalja össze a következő ábra, ahol a vektorok ábrázolása mellett azt is megadtuk, hogy milyen metódussal lehet a koordinátákat megkapni, ha egy egéresemény (pl. a bal gomb lenyomása) hatására egy eseménykezelőben az eseményobjektum rendelkezésre áll. Itt két esetet is feltüntettünk. A kettő abban tér el, hogy míg a bal oldali elrendezésben csak keretek (Frame) vannak és az azokon belüli pontokat akarjuk meghatározni, a jobb oldalon láthatónál a kereten belüli grafikus elem, jelen esetben címke (Label), pontjára vagyunk kíváncsiak.

Az ábra a grafikus objektumokat táblázatos elrendezésben mutatja. Kérdés az, hogy a pontkoordináták alapján hogyan kaphatjuk meg a befoglaló cella sor- és oszlopindexét. Ehhez a grid_location() metódus szolgál, amit arra az elemre kell meghívni, amelyben a rácsos elrendezés van és ehhez képest kell az adott, az egérkurzor által mutatott, pontot azonosítani. Ez a bal oldali esetben egyszerűbb, mert a pontot tartalmazó keret szülőjében, ami a főablak (gyökér elem), van a táblázatos elrendezés. Ennek alapján a grid_location() metódusnak azon vektor koordinátáit kell megadni, amely két vektor összege: az első a gyökér elemtől az adott keret elem bal felső sarkáig mutat, a másik a keret bal felső sarkától a pontig. Az ábra jelöléseivel ez a fekete és piros vektorok összege.

Kicsit összetettebb a helyzet a jobb oldali esetben, ha a pont a címkén van (az egérkattintás esemény a címkén történik). Ugyanis a címke szülője a keret és nem a gyökér, ami a táblázatot menedzseli. Ezért, ha az egérkattintás esemény mind a keretekhez, mind a címkékhez hozzá van rendelve, akkor az eseménykezelőben vizsgálni kell, hogy melyiken történt az esemény. Ha a címkén, akkor annak szülőjével kell a további műveleteket végezni.

Mindezt az alább látható példakódban láthatjuk leprogramozva. A részletes kommentek segítik a megértést.

E programot futtatva a következő ábra mutat két példát arra, amikor a bal egérgomb egy címke, illetve amikor egy keret felületén került lenyomásra.

Megjegyzés: a táblázatcella azonosítását a grid_info() metódussal is meg lehet tenni, de most pontkoordináták alapján akartunk dolgozni, ezért használtuk a grid_location() metódust.

A grafikus felhasználói felület létrehozásával, és többek között a táblázatos elrendezéssel is, példákkal illusztrált részletes leírásával a Python tudásépítés lépésről lépésre című e-könyv „Grafikus felhasználói felület készítése” fejezete foglalkozik.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.