Hogyan készítsünk Excel táblához hasonló számolótáblát? – 4.rész

Folytatjuk az előző bejegyzésekben elkezdett Excelszerű egyszerű számolótábla megvalósítását. Legutóbb a cellatartalom kiértékelését végző eseménykezelőt implementáltuk. Most annak az eseménykezelőnek a kidolgozásával kezdjük, amellyel egy egéresemény bekövetkeztekor meg tudjuk jeleníteni a cellában levő képletet (kifejezést), ha volt ilyen. Ennek felhasználásával utána a táblázat cellaértékeinek aktualizálását végző eseménykezelőt is lekódoljuk.

Az előző bejegyzésekből már ismert, hogy az adott cellához tartozó képlet megjelenítését konkrétan a reveal_cell_expression_event_handler() eseménykezelő függvénnyel kívánjuk megvalósítani, ami a bal egérgomb dupla kattintásának hatására fut le. Ekkor a következő műveleteket hajtjuk végre:

1) Meghatározzuk az eseménnyel érintett beviteli mező objektumot.

2) E beviteli mezőhöz rendelt kontrollváltozót és az eltárolt kifejezést kikérjük az ezeket tartalmazó szótárból. Ehhez felhasználjuk a már megvalósított és rendelkezésre álló get_cell_indexes() függvényt, amely a beviteli mező grid elrendezésbeli sor- és oszlopindexeit adja vissza egy tuple objektumban.

3) Ha az adott cellához tartozik kifejezés, vagyis a tárolt érték nem üres karakterlánc, akkor azt megjelenítjük a beviteli mezőben. Ezt az adott beviteli mezőhöz tartozó kontrollváltozó set() metódusának hívásával tehetjük meg, argumentumként a kifejezést reprezentáló karakterláncot adva.

4) Végül, a beviteli mezőben megjelenő tartalom végére állítjuk a kurzort a beviteli mezőre meghívott icursor() metódussal.

A fenti lépéseket két részletben valósítjuk meg. A reveal_cell_expression_event_handler() eseménykezelő az 1) lépés után meghív egy segédfüggvényt reveal_cell_expression néven, amely a 2)-4) pontokban foglaltakat hajtja végre. E két függvény definícióját mutatjuk alább. Arra, hogy miért bontottuk ketté a megvalósítást két függvénybe mindjárt választ adunk.

Miután elő tudjuk hívni egy cellához eltárolt képletet, könnyen meg tudjuk valósítani a táblázat cellatartalmainak aktualizálását, azaz képleteinek újraértékelését, ha valamely cella értékében változás történne. Ehhez nem kell mást tenni, mint

a) végigvenni a táblázat celláit (beviteli mező objektumait),

b) minden egyes beviteli mezőre kikérni a hozzá tartozó képletet,

c) a már implementált és rendelkezésre álló eval_cell_content() metódussal kiértékeljük a képletet és eredményét megjelenítjük a cellában.

Látjuk, hogy a b) pontban nem esemény, hanem az éppen aktuális beviteli mező alapján kérjük ki a cella tárolt képletét. Ezért volt értelme külön definiálni a reveal_cell_expression() függvényt, mert az argumentumként beviteli mezőt vár.

A fenti a)-c) pontok alapján a cellák kifejezéseinek aktualizálását végző update_expressions() metódus definícióját szintén fent láthatjuk a jelen bejegyzéshez releváns esemény-eseménykezelő hozzárendelésekkel együtt.

A következő bejegyzésben azon eseménykezelőket valósítjuk meg, amelyek lehetővé teszik a kurzor más cellába áthelyezését, a cella tartalmának törlését, valamint az oszlopszélesség igazítását a cella tartalom hosszához.

E bejegyzéshez a Python tudásépítés lépésről lépésre című e-könyvben különösen a következő részeket érdemes átnézni: „Grafikus felhasználói felület készítése” fejezet „Kontrollváltozók” és „A grafikus elemek fajtái, létrehozásuk és konfigurálásuk” alfejezete, és ebben a „Beviteli mező” alcím.

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