Hétszegmenses számjegyek grafikus megjelenítése

Ha valamilyen digitális kijelzővel rendelkező készüléket vagy eszközt (pl. digitális óra, LCD kijelzős számológép, műszer stb.) szeretnénk programmal modellezni, akkor a hét szegmensből álló számjegyeket meg kell tudni jeleníteni a grafikus felhasználói felületen.

Ezt célszerű azzal kezdeni, hogy megtervezzük a hétszegmenses számjegyek stílusát, formáját, vagyis azt, hogy az egyes szegmensek milyen síkalakzatok legyenek, illetve azt, hogy az alkotó szakaszok egymáshoz képes milyen arányúak. Mivel a digitális kijelzőkön a szegmensek elkülönülnek egymástól, ezért a közöttük levő rést (gap) is célszerű beállíthatóvá tenni, ami hatással van a megjelenő számformára.

A tervezési és programozó munkánk jelentősen könnyebbé válik, ha egyszerűsítő feltételként előírjuk, hogy a számjegyek vízszintesen és függőlegesen is szimmetrikusak. A szegmensek tervezéséhez a jelöléseket – amik egyúttal a programban változónevek is lesznek – a következő ábra mutatja két, részben eltérő szegmensekből álló, számjegyformákra.

Mivel szimmetrikus elrendezésűek a szegmensek, ezért elegendő csak pl. a felső (TOP), bal felső (TOP_LEFT) és a középső (CENTER) szegmenseket megtervezni, mert a többi szegmens ezekből a szélességet és hosszúságot felező tengelyre vett tükrözéssel előállítható.

A megvalósítás egy lehetséges programkódját követhetjük alább, három modulba szervezve.

A fenti ábrán mutatott két megjelenési formátumú számjegyeket a seven_segment_model modulban a DigitSegmentDefinitions két alosztálya (Digit1SegmentDefinitions és Digit2SegmentDefinitions) definiálja a szegmenseket meghatározó pontok relatív távolságainak megadásával. Ha egy ezektől különböző számjegyformát akarunk, akkor azt a DigitSegmentDefinitions egy új alosztályának létrehozásával tehetjük meg és adhatjuk meg az egyes szegmenspontok relatív távolságát a meglévő két alosztályhoz hasonló módon.

A számjegy, illetve azt alkotó szegmensek tényleges pontjait valamely DigitSegmentDefinitions alosztályból a modul Digit7SegmentsPoints osztálya állítja elő.

Ha a szegmensek definiálása megvan, akkor a kívánt számjegyeket grafikusan a seven_segment_digit_widget modul Digits7Segments osztály példányosításával lehet előállítani.

A számjegyek egymást követően lesznek lehelyezve az osztálypéldányban mint tkinter keretben (Frame). A konstruktor első, master argumentuma a szülő grafikus elem, amely az osztálypéldányt menedzseli. A második, digits argumentummal a megjelenítendő számjegyeket kell megadni karakterláncként vagy int típusú pozitív számként. A harmadik, width argumentum a számok szélessége pixelben, ami egyben a szegmensszélesség is. A szegmensmagasságot és a szegmensek közötti függőleges rést opcionálisan lehet megadni a segment_height és gap argumentumokkal. Ha ezek az alapértelmezett None értéken vannak, akkor egy előre beállított, a szegmensszélességhez igazodó értékeket kapnak. Ezeket követően két, csak kulcsszavas opcionális argumentumot lehet megadni. A segment_color a számjegy, azaz a szegmensek színének beállítására szolgál, amit a szín érvényes nevével vagy színkóddal lehet megadni.

A Digits7Segments a szegmensek pontjai alapján rajzolja meg a számjegyeket, azaz a szegmenseket reprezentáló sokszögeket. Ehhez a Digits7Segments példányosításakor a szegmenseket leíró valamely DigitSegmentDefinitions alosztályt kell megadni az opcionális segmentsdefinitions_class argumentummal, amelynek alapértelmezett értéke a seven_segment_model modul Digit1SegmentDefinitions osztálya.

A seven_segment_digit_widget modul One7SegmentDigit osztálya alapvetően egy segédosztály, de önállóan is alkalmazható, ha csupán egyetlen számjegyet akarunk létrehozni, bár ezt a Digits7Segments osztálypéldánnyal ugyanúgy megtehetjük.

A seven_segment_test_app modul szkriptként futtatva bemutatja a Digits7Segments használatát és a hétszegmenses számjegyek megjelenítését. A grafikus beviteli felületen meghatározhatjuk a megjelenítendő számjegyeket, azok színét és méretét, valamint egy választógombbal a számjegyek formáját/stílusát váltogathatjuk.

A modulokban az osztályok felépítésének és működésének megértését a fenti leírások mellett a részletes kommentek segítik. A program Python 3.10+ alatt fut.

Néhány eredményképet az az alábbi ábra mutat.

A modulok forráskódja a következő GitHub linken is elérhető: https://github.com/pythontudasepites/seven_segment_digits

E bejegyzésben programozási szempontból elsődlegesen a grafikus felhasználói felület tervezése és megvalósítása volt a fókuszban, amelyhez ismereteket a Python tudásépítés lépésről lépésre című e-könyvben a „Grafikus felhasználói felület készítése” fejezetben lehet részletesen olvasni. Ugyanakkor sok más nyelvi elemet és lehetőséget is alkalmaztunk, beleértve a szabványos könyvtár számos más moduljának használatát is, amelyekről az e-könyv „Készétel fogyasztás – a szabványos könyvtár moduljainak használata” fejezeten belül szerezhetünk ismereteket feladatorientáltan, számos példakóddal segítve a megértést. E mellett a programtervezési és kódolási készségeket nagyban fejleszti a bemutatott, illetve ehhez hasonló kicsit összetettebb programkódok tanulmányozása, és a feladat vagy egy részprobléma más megközelítéssel történő megoldásának megkísérlése.

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