IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

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.
MVC je softvérová architektúra, ktorá rozdeľuje layout projektu do troch komponentov. Tento postup nám umožní modifikovať jednej z nich s minimálnym vplyvom na ostatné.

Naša konečná verzia aplikácie bude onedlho vyzerať takto:

Tkinter - Okenné aplikácie v Pythone

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.
Kód metódy bude vyzerať takto:
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.


 

Všetky články v sekcii
Tkinter - Okenné aplikácie v Pythone
Preskočiť článok
(neodporúčame)
Aplikácia Kalkulačka v tkinter - Tvoríme GUI
Článok pre vás napísal Jan Kumpf
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity