Egyéni görgetősáv készítése

Legyen a feladat egy olyan egyéni grafikus vezérlőelem készítése, amely a tkinter modul által kínált görgetősávhoz (Scrollbar) hasonló, és amelynél a csúszkát (slider) a vezetőcsatornában (trough) két módon lehet mozgatni:

– a bal vagy jobb oldali nyomógombokkal az aktuálisan érvényes lépésközzel (resolution), vagy

– a bal egérgombbal a vezetőcsatornába történő klikkeléssel. Ekkor a csúszka erre a helyre ugrik.

A lépésköz, ha nem írjuk felül, alapértelmezésben legyen a vezérlőelem példányosításakor megadott vezetőcsatorna-hossz 1%-a. Tehát, ha mondjuk a csatornahossz 300 pixel, akkor a csúszka minimálisan 3 pixelt mozdul el.

A csúszka vezérlésre úgy használható, hogy minden egyes elmozdulásakor a command nevű konfigurációs paraméternek értékül adott hívható objektum legyen meghívva, és argumentumként a csúszkának a vezetőcsatorna hosszában való relatív helyzetének 0..1 intervallumbeli arányszámát kapja meg. Tehát, ha például a csúszka a vezetőcsatorna felénél van, akkor híváskor 0.5 lesz az átadott érték.

Legyen a készítendő egyéni grafikus vezérlőelem osztályának a neve CustomScrollbar. Hasonlóan a tkinter grafikus vezérlőihez (widget) a CustomScrollbar is rendelkezzen néhány beállítható configurációs paraméterrel (options). Ezek a következők:

trough_width: a vezetőcsatorna szélessége pixelben

trough_height: a vezetőcsatorna magassága pixelben

trough_color: a vezetőcsatorna színe

slider_color: a csúszka színe

resolution: az a pixelben mért lépésköz, amellyel a bal vagy jobb gombok megnyomásakor a csúszka elmozdul.

command: hívható objektum, amelynek híváskor a csúszka vezetőcsatornabeli relatív helyzete float számként át lesz adva.

variable: egy DoubleVar vagy StringVar típusú kontrollváltozó, amellyel a csúszka aktuális relatív helyzete kikérhető.

Ahogy más tkinter grafikus elemek esetében, a CustomScrollbar esetében is a felsorolt konfigurációs paraméterek értékét lehessen kikérni a CustomScrollbar példányra meghívott cget() metódussal, valamint az értéküket beállítani a config() vagy configure() metódusokkal. Az említett két nyilvános metóduson felül legyen lehetőség a csúszkát egy adott pozícióba állítani az osztályban definiált move_slider_to() nyilvános metódussal.

A kívánalmaknak megfelelő CustomScrollbar osztály definícióját láthatjuk alább. A felépítést és a működési logika megértését a részletes kommentek segítik.

Azt, hogy az elkészült CustomScrollbar teljesíti-e az előírt követelményeket egy külön modulban megírt tesztalkalmazással ellenőrizzük. Ez az egyéni görgetősáv működésének és konfigurálhatóságának tesztelését teszi lehetővé olyan módon, hogy az alkalmazás indításakor kirajzol egy kört, valamint a kör kiinduló méretét befoglaló és a kétszer akkora sugarú kört befoglaló négyzeteket. Ezek alatt jelenik meg az egyéni görgetősáv. Ez alatt pedig egy olyan vezérlőpanel, ahol a görgetősáv konfigurálható paramétereinek értékét lehet állítani. Az új értékeket a megfelelő beviteli mezőkbe kell beírni és a „Konfiguráció aktualizálás” gombra kattintva érvényesíteni. Ekkor a görgetősáv az új konfiguráció szerint fog megjelenni. A lépésköz változtatásának hatását természetesen csak a csúszka jobb vagy bal oldali gombokkal történő mozgatásakor érzékeljük. Ha a csúszka elmozdul, akkor a kör mérete csökken vagy nő. Növelni legfeljebb a kiinduló méret kétszeresére lehet.

A tesztalkalmazás custom_scrollbar_test_app modulját a benne definiált osztályokkal láthatjuk alább. A működéshez e modulfájlt kell szkriptként futtatni. A futtatáshoz Python 3.10+ szükséges.

A két modulfájl elérhető a https://github.com/pythontudasepites/custom_scrollbar linken.

A következő képernyőképek különböző konfigurációs beállítások és csúszkaállások mellett mutatják az egyéni görgetősáv kinézetét, valamint a tesztkör méretét.

A bemutatott egyéni kialakítású görgetősáv és a tesztprogram elkészítéséhez szükséges ismeretek a Python tudásépítés lépésről lépésre című e-könyvben megtalálhatók elsősorban a „Grafikus felhasználói felület készítése”, című fejezetben, ami nem véletlenül az utolsó fejezet, mert az azt megelőző többi fejezet tartalmának ismeretét feltételezi, arra épít.

A fenti osztálydefiníciókban szereplő kódokat nem csak azért érdemes tanulmányozni, mert a Python tudásépítés lépésről lépésre című e-könyvben közölt példákhoz képest egy újabb összetett alkalmazási példa, hanem mert a tkinter modulhoz kapcsolódó sok nyelvi eszközt kontextusban használva lehet látni, vagyis megoldási mintákként is szolgálnak (természetesen csak akkor, ha az alapismeretek megvannak). Mindez azért is lehet hasznos, mert a tkinter modul dokumentációja a nyelvi eszköztár tekintetében nem megy részletekbe, egy-egy felmerülő használati kérdést illetően önmagában legtöbb esetben nem ad kellő útmutatást.

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