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