Хотелось бы услышать ваше мнение по этому коду:
#! /usr/bin/python
'''Calculator in object oriented style,
__future__ to use true division by '/'
'''
from __future__ import division
from Tkinter import \
Tk, Frame, Entry, Button, \
END, TOP, LEFT, RIGHT
class GUI:
def __init__(self, title='My calc',
width_root=160, height_root=170,
width_num=1, width_math=2,
btn_names='C7894561230.=+-/*'):
self.root = Tk()
self.root.title(title)
self.root.maxsize(width = width_root, height = height_root)
self.root.minsize(width = width_root, height = height_root)
fra = Frame(self.root)
fra_ent = Frame(self.root)
fra_math = Frame(self.root)
fra_num = Frame(fra)
fra_num2 = Frame(fra)
fra_num3 = Frame(fra)
fra_num4 = Frame(fra)
self.entry = Entry(fra_ent)
self.entry.insert(END, '0')
self.entry.pack(side = TOP)
fra_ent.pack(side = TOP)
fra.pack(side = LEFT)
fra_math.pack(side = RIGHT)
fra_num.pack(side = TOP)
fra_num2.pack(side = TOP)
fra_num3.pack(side = TOP)
fra_num4.pack(side = TOP)
strct = {btn_names[0]: (fra_ent, width_math, RIGHT)}
for i in btn_names[1:4]:
strct[i] = (fra_num, width_num, LEFT)
for i in btn_names[4:7]:
strct[i] = (fra_num2, width_num, LEFT)
for i in btn_names[7:10]:
strct[i] = (fra_num3, width_num, LEFT)
for i in btn_names[10:13]:
strct[i] = (fra_num4, width_num, LEFT)
for i in btn_names[13:]:
strct[i] = (fra_math, width_math, TOP)
for name in btn_names:
Button(strct[name][0], text = name,
width = strct[name][1],
command = lambda x = name: self.write(x)
).pack(side = strct[name][2])
def write(self, char):
self.show(char)
def show(self, value):
self.entry.delete(first = 0, last = END)
self.entry.insert(END, value)
def run(self):
self.root.mainloop()
class Calc(GUI):
def __init__(self):
GUI.__init__(self)
self.numb = ''
self.memr = ''
self.result = ''
self.switch = {'=': lambda: self.calculate(),
'C': lambda: self.reset(),
'.': lambda: self.dot(),
'+': lambda: self.operation('+'),
'-': lambda: self.operation('-'),
'*': lambda: self.operation('*'),
'/': lambda: self.operation('/')}
def write(self, char):
if char in self.switch:
self.switch[char]()
else:
self.numb += char
self.show(self.numb)
def reset(self):
self.numb = ''
self.memr = ''
self.result = ''
self.show('0')
def dot(self):
if not self.numb:
# Has not achieved the number before '.'
if self.result:
self.reset()
self.numb = '0.'
self.show(self.numb)
elif '.' in self.numb:
# Repeated, incorrect entry '.'
pass
else:
self.numb += '.'
self.show(self.numb)
def operation(self, char):
'''Arithmetic operations'''
if self.result:
# Use the result of the previous calculation
self.numb = self.result
self.result = ''
self.memr += self.numb + char
self.show(self.numb + char)
self.numb = ''
def calculate(self):
try:
result = eval('%s%s' % (self.memr, self.numb))
except (SyntaxError, ZeroDivisionError):
self.reset()
self.show('ERROR')
else:
self.result = str(result)
self.numb = ''
self.memr = ''
self.show(self.result)
if __name__ == '__main__':
Calc().run()