From fa17d657e402ae11006ae46ead36e5459cc54c4e Mon Sep 17 00:00:00 2001 From: error042 Date: Fri, 5 Aug 2022 10:22:18 +0200 Subject: [PATCH] Initial commit --- .idea/.gitignore | 8 +++ .idea/MvcTaschenrechner.iml | 10 +++ .../inspectionProfiles/profiles_settings.xml | 6 ++ .idea/misc.xml | 4 ++ .idea/modules.xml | 8 +++ controller.py | 21 ++++++ model.py | 54 +++++++++++++++ view.py | 69 +++++++++++++++++++ 8 files changed, 180 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/MvcTaschenrechner.iml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 controller.py create mode 100644 model.py create mode 100644 view.py diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/MvcTaschenrechner.iml b/.idea/MvcTaschenrechner.iml new file mode 100644 index 0000000..74d515a --- /dev/null +++ b/.idea/MvcTaschenrechner.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..b683e16 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e51b136 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/controller.py b/controller.py new file mode 100644 index 0000000..cb5c990 --- /dev/null +++ b/controller.py @@ -0,0 +1,21 @@ +from model import Model +from view import View + + +class Controller: + def __init__(self): + self.model = Model() + self.view = View(self) + + def main(self): + self.view.main() + + def on_button_click(self, caption): + result = self.model.calculate(caption) + + self.view.value_var.set(result) + + +if __name__ == '__main__': + calculator = Controller() + calculator.main() diff --git a/model.py b/model.py new file mode 100644 index 0000000..b9f8d2a --- /dev/null +++ b/model.py @@ -0,0 +1,54 @@ +''' +Created on Jun 03, 2022 + +@author: error042 +''' + +class Model: + ''' + classdocs + ''' + + def __init__(self): + ''' + Constructor + ''' + self.previous_value = '' + self.value = '' + self.operator = '' + + def calculate(self, caption): + if caption == 'C': + self.value = '' + + elif caption == '+/-': + self.value = self.value[1:] if self.value[0] == '-' else '-' + self.value + + elif caption == '.': + if not caption in self.value: + self.value += caption + elif self.value[-1] == caption: + self.value = self.value[:-1] + + elif caption == '%': + self.operator = '/' + self.previous_value = self.value + self.value = '100' + self.value = str(self._evaluate()) + + elif caption == '=': + self.value = str(self._evaluate()) + + elif isinstance(caption, int): + self.value += str(caption) + + else: + if self.value: + self.operator = caption + self.previous_value = self.value + self.value = '' + + return self.value + + def _evaluate(self): + return eval(self.previous_value+self.operator+self.value) \ No newline at end of file diff --git a/view.py b/view.py new file mode 100644 index 0000000..aa12f7c --- /dev/null +++ b/view.py @@ -0,0 +1,69 @@ +''' +Created on Jun 03, 2022 + +@author: error042 +''' +import tkinter as tk +from tkinter import ttk + + +class View(tk.Tk): + ''' + classdocs + ''' + + PAD = 10 + MAX_BUTTONS_PER_ROW = 4 + button_captions = [ + 'C', '+/-', '%', '/', + 7, 8, 9, '*', + 4, 5, 6, '-', + 1, 2, 3, '+', + 0, '.', '=' + ] + + def __init__(self, controller): + ''' + Constructor + ''' + super().__init__() + + self.title('PyCalc') + + self.controller = controller + + self.value_var = tk.StringVar() + + self._make_main_frame() + self._make_entry() + self._make_buttons() + + def main(self): + self.mainloop() + + def _make_main_frame(self): + self.main_frm = ttk.Frame(self) + self.main_frm.pack(padx=self.PAD, pady=self.PAD) + + def _make_entry(self): + ent = ttk.Entry(self.main_frm, justify='right', textvariable=self.value_var, state='readonly') + ent.pack(fill='x') + + def _make_buttons(self): + outer_frm = ttk.Frame(self.main_frm) + outer_frm.pack() + + frm = ttk.Frame(outer_frm) + frm.pack() + + for buttons_in_row, caption in enumerate(self.button_captions): + if buttons_in_row % self.MAX_BUTTONS_PER_ROW == 0: + frm = ttk.Frame(outer_frm) + frm.pack() + + btn = ttk.Button( + frm, text=caption, command=( + lambda button=caption: self.controller.on_button_click(button) + ) + ) + btn.pack(side='left')