2. diel - Aplikácia Kalkulačka v tkinter - MVC model
V nasledujúcom tutoriále GUI aplikácií v Pythone si
pomocou knižnice tkinter
začneme tvoriť aplikáciu Kalkulačka.
Využijeme na to architektúru MVC. Ako prvý krok si
zostavíme triedy pre jednotlivé komponenty.
Aplikácia Kalkulačka
pomocou knižnice tkinter
Svoju cestu do hlbín GUI aplikácií v tkinter
začneme pri
užitočnom a často využívanom nástroji. Naša prvá aplikácia bude
Kakulačka. Najprv si naplánujeme, ako budeme pri tvorbe tohto projektu
postupovať. Aplikáciu totiž spracujeme na základe architektúry
MVC (M odel- View -
C ontroller). Viac o architektúre sa dozvieme v lekcii MVC architektúra). Aplikáciu
rozdelíme do troch nezávislých blokov, ktorými budú:
- dátový model aplikácie,
- užívateľské rozhranie,
- riadiaca logika.
Naša konečná verzia aplikácie bude onedlho vyzerať takto:
Model - správa dát kalkulačky
Začnime tým, že si v rámci nového projektu v zložke
Kalkulacka/
založíme súbor calculatormodel.py
.V
ňom vytvoríme novú triedu CalculatorModel
s konštruktorom
__init__
, ktorý inicializuje atribút expression
(budúci výraz pre výpočet) ako prázdny reťazec:
import tkinter as tk class CalculatorModel: def __init__(self): self.expression = ""
Metóda add_to_expression()
Ďalej v triede CalculatorModel
vytvoríme metódu
add_to_expression()
, ktorá nám poslúži na pridanie
používateľovho vstupu do výrazu. Metóda prijíma parameter
value
, ktorý reprezentuje používateľov vstup, a pripája ho k
existujúcemu výrazu:
def add_to_expression(self, value): self.expression += str(value)
Metóda
evaluate_expression()
Nasledujúci kód bude zodpovedný za vyhodnotenie výrazu a aktualizáciu
výsledku. Metóda evaluate_expression()
používa funkciu
eval()
na vyhodnotenie výrazu ako výrazu v jazyku Python.
Výsledok je uložený ako string
v atribúte
expression
. Pomocou bloku except
zaistíme, aby
kalkulačka správne zareagovala pri všetkých možných scenároch. Do
atribútu expression
vložíme text, ktorý nám objasní príčinu
chyby:
- ZeroDivisionError upozorní používateľa na chybu, ak sa snaží deliť nulou,
- SyntaxError sa vyvolá, ak vložený znak bude neplatný, napr. písmeno,
- Exception as e využijeme v prípade, že sa naskytne iná chyba.
def evaluate_expression(self): try: result = eval(self.expression) self.expression = str(result) except ZeroDivisionError: self.expression = "Error: Division by zero" except SyntaxError: self.expression = "Error: Invalid syntax" except Exception: self.expression = "Error:" + str(e)
Zhrnutie dátového modelu
Vďaka modelu zabaľujeme stav kalkulačky a správania súvisiacich s manipuláciou s výrazom. Model nám umožňuje pridávať vstupy do výrazu. Tie sa následne vyhodnotia na získanie výsledku. Model neinteraguje s užívateľským rozhraním ani nevykonáva žiadne operácie špecifické pre grafické rozhranie. Hlavnú úlohu sme stanovili tak, aby model spravoval výraz a vykonával výpočty.
Oddelením Modelu od View (užívateľského rozhrania) a Controlleru (riadiacej logiky) dodržujeme princípy architektonického vzoru MVC, čo umožňuje modulárnu a organizovanú štruktúru kódu.
Controller - riadiaca logika kalkulačky
Trieda CalculatorController
, ktorá tvorí
Controller v MVC nám poslúži ako prostredník medzi
Modelom (CalculatorModel
) a užívateľským
rozhraním - View (CalculatorView
). Trieda
CalculatorController
sprostredkováva komunikáciu medzi týmito
dvoma časťami aplikácie.
Začneme opäť tým, že v priečinku Kalkulacka/
vytvoríme
nový súbor s názvom calculatorcontroller.py
. V ňom si následne
pripravíme triedu CalculatorController
. V nej nadefinujeme
konštruktor __init__
, ktorý prijíma inštanciu Modelu a View ako
parametre a ukladá ich ako atribúty:
import tkinter as tk class CalculatorController: def __init__(self, model, view): self.model = model self.view = view
Metóda process_input()
Túto metódu si nastavíme tak, že bude zodpovedná za spracovanie výrazu
v Modele na základe používateľových vstupov. Ak je náš
vstup =
(rovná sa), zavoláme metódu
evaluate_expression()
v modeli pre vyhodnotenie výrazu. V
opačnom prípade zavoláme metódu
add_to_expression()
v modeli pre pridanie zadanej hodnoty k
výrazu. Po zadaní vstupu zavoláme metódu update_view()
pre
aktualizáciu zobrazenia:
def process_input(self, value): if value == "=": self.model.evaluate_expression() else: self.model.add_to_expression(value) self.update_view()
Metóda clear_input()
Užívatelia určite ocenia, keď budú schopní vymazať napríklad zle vložené cifry, prípadne odstrániť starý výpočet a začať kalkulovať nový. Naše ďalšie funkcie odstránia posledný znak z výrazu v modeli.
Využijeme na to sekvenčné indexovanie ([:-1]
), ktoré
odstráni posledný znak z výrazu. Po dokončení operácie zavoláme metódu
update_view()
pre aktualizáciu zobrazenia:
def clear_input(self): self.model.expression = self.model.expression[:-1] self.update_view()
Metóda clear_all()
Dokázali sme vymazať posledný znak, výborne! Ale čo tak celý vstup?
Nebojme sa ničoho, nie je v tom žiadna veda. Potrebujeme iba nastaviť
atribút expression
na prázdny string
a následne
aktualizovať zobrazenie. To docielime nasledovne:
def clear_all(self): self.model.expression = "" self.update_view()
Metóda update_view()
Našou poslednou úlohou pre túto triedu zostalo nadefinovať metódu pre aktualizáciu zobrazenia výsledkov. Najprv zmažeme obsah vstupného widgetu a potom vložíme aktuálny výraz z modelu:
def update_view(self): self.view.entry.delete(0, tk.END) self.view.entry.insert(0, self.model.expression)
Krátke zhrnutie
Vďaka tomu, že sme oddelili logiku aplikácie (Model) od používateľského rozhrania (View), je pre nás teraz jednoduchšia správa a údržba kódu. Controller pre nás prepája tieto dve časti. Následne umožňuje vzájomnú komunikáciu a spoluprácu pri vývoji kalkulačky.
Mozog kalkulačky máme pripravený. Nabudúce už začneme tvoriť užívateľské rozhranie, kvôli ktorému sme tu. Pre dnešok sme ale urobili práce dosť 😎
V ďalšej lekcii, Aplikácia Kalkulačka v tkinter - Tvoríme GUI , si vytvoríme užívateľské rozhranie pre aplikáciu Kalkulačka. Naprogramujeme hlavné okno aplikácie, vstupné polia a tlačidlá. Tým dosadíme patričné funkcie.