commit
fa17d657e4
8 changed files with 180 additions and 0 deletions
@ -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 |
||||
@ -0,0 +1,10 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<module type="PYTHON_MODULE" version="4"> |
||||
<component name="NewModuleRootManager"> |
||||
<content url="file://$MODULE_DIR$"> |
||||
<excludeFolder url="file://$MODULE_DIR$/venv" /> |
||||
</content> |
||||
<orderEntry type="inheritedJdk" /> |
||||
<orderEntry type="sourceFolder" forTests="false" /> |
||||
</component> |
||||
</module> |
||||
@ -0,0 +1,6 @@ |
||||
<component name="InspectionProjectProfileManager"> |
||||
<settings> |
||||
<option name="USE_PROJECT_PROFILE" value="false" /> |
||||
<version value="1.0" /> |
||||
</settings> |
||||
</component> |
||||
@ -0,0 +1,4 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project version="4"> |
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (MvcTaschenrechner) (2)" project-jdk-type="Python SDK" /> |
||||
</project> |
||||
@ -0,0 +1,8 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project version="4"> |
||||
<component name="ProjectModuleManager"> |
||||
<modules> |
||||
<module fileurl="file://$PROJECT_DIR$/.idea/MvcTaschenrechner.iml" filepath="$PROJECT_DIR$/.idea/MvcTaschenrechner.iml" /> |
||||
</modules> |
||||
</component> |
||||
</project> |
||||
@ -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() |
||||
@ -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) |
||||
@ -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') |
||||
Loading…
Reference in new issue