Ovális (nem ellipszis) alakzat megvalósítása

Az előző bejegyzésben megállapítottuk, hogy a tkinter modul Canvas osztályának create_oval() metódusa ellipszist (vagy speciálisan, ha a befoglaló négyszög egy négyzet, akkor egy kört) jelenít meg. Kérdés, hogy ha nem ellipszist, hanem más ovális alakzatot akarunk kirajzolni (akár pl. egy tényleges tojásformát) akkor azt hogyan tudnánk megtenni.

Ovális forma elvben végtelen sok lehet, de ahhoz, hogy geometriailag viszonylag könnyen szerkeszthető, illetve programmal kirajzolható legyen, általában jól ismert egyszerű ívelt síkalakzatokat használnak egy adott ovális létrehozásához. Mi is ezt fogjuk most tenni, és négy körív segítségével állítunk elő egy mindkét tengelyre szimmetrikus ovális formát. Ennek felépítését mutatja az ábra:

Itt két egymással érintkező kör ívei adják az ovális bal és jobb oldali ívszakaszait. A maradék felső, illetve az alsó ívszakaszokat pedig olyan körívek, amely körök középpontja az érintkező körök alsó, illetve felső közös érintőinek közepe. Ezen alakzatok (kör és körív) már kirajzoltathatók a Canvas megfelelő metódusaival.

A teljes ovális alakzatot a középpontjával, és szélességével fogjuk jellemezni. Ezeket adottnak véve, az ábrán láthatjuk azon összefüggéseket, amelyek szükségesek lesznek az ovális programbeli modellezéséhez és kirajzolásához.

Amennyiben arra is van igényünk, hogy az oválisnak ne csak a körvonala jelenjen, meg, hanem ki is lehessen tölteni valamilyen színnel – hasonlóan, mint a Canvas create_oval() metódussal létrehozott ellipszist -, akkor előzetes megfontolást igényel a segédalakzatok (jelen esetben a körök, körcikkek) kiválasztása és egymáshoz képesti elhelyezése. Ha alaposabban megnézzük az ábra két körét és két körcikkét, láthatjuk, hogy ha ezeket azonos színnel töltjük ki, akkor a teljes egyéni ovális formánk is ki lesz töltve az adott színnel.

A kitölthetőség hatással lesz a program megjelenítési feladataira is. Egyrészt a körvonal (kontúr) kirajzolásához négy körív kell, amelyeket a Canvas create_arc() metódusával lehet kirajzolni, ahol a style opció ’arc’ értékre van állítva, azaz csak egy ívet rajzol. A kitölthetőséghez viszont két kört és két körcikket kell rajzolni. Ez utóbbit szintén a Canvas create_arc() metódusával lehet kirajzolni, de most a style paraméternek a ’pieslice’ értéket kell adni.

Az egyéni ovális formát egy Oval nevű osztállyal valósítjuk meg, amelyben az előbb említett kontúr kirajzolását a draw() metódus, a kitöltést lehetővé tevő összetevők létrehozását a fill_area() nevű metódus fogja végezni, amelyet a draw() hív meg. Az osztály teljes definícióját alább láthatjuk, ahol még egy geometriai pontot modellező Point osztályt, mint segédosztályt is lehet látni. A részletes kommentek segítik a megértést.

Az egyéni ovális alakzat mint az Oval példánya a példányosításkor megadott névvel hivatkozva számos olyan Canvas metódussal használható, amelyeknél az összetevő rajzelemek együttesen vannak kezelve, illetve hatásukban és eredményükben nem érzékelhető, hogy az alakzat összetevőkből áll. Ilyen műveletek például az átméretezés és az áthelyezés.

Ugyanakkor vannak olyan Canvas metódusok, amelyekkel nem, vagy nem megbízhatóan működik az Oval példány, mert az előbb említett feltételek nem teljesülnek. Ide tartozik például a konfigurációt módosító itemconfig() metódus is. Ugyanis ez olyan összetevő rajzelemek jellemzőit is változtatná, amelyekét nem szeretnénk (pl. az outline opció nem kívánatos módon a kitöltést lehetővé tevő rajzelemek körvonalát is módosítja). Ezért látunk az Oval osztályban egy saját itemconfig() metódust, mert konfiguráláshoz ezt kell használni. Konfigurálni a normál állapothoz tartozó fill, width, dash és outline jellemzőket lehet. /A dashoffset, stipple és outlinestipple opciók Windows alatt nem működnek./

Az említett lehetőségek bemutatására a tesztsorok a következők:

A futtatás után megjelenő felületen a piros színű oválisra való kattintás utáni állapotot az alábbi ábra képernyőképe mutatja.

A grafikus felhasználói felület létrehozásával, benne a Canvas elem 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.