In part3 we will:
- Create methods in our Controller class
- Bind the buttons to the methods
- Create a simple validation
Create methods
def valid_input(self,arg):
''' Method for validating input '''
if arg.isalpha() or arg == '=':
return False
else:
return True
def clear(self, event):
''' Method for clearing the entry field '''
self.window.entry.delete(0, 'end')
def insert(self, var):
''' Method for inserting numbers in the entry field '''
self.window.entry.insert('end', var)
def calculate(self, event):
''' Method for doing calculations '''
# Get the values of the entry field
values = self.window.entry.get()
# Do and get the calculations from the entry field using eval
# It is reccommended not to use eval but, for our purpose
# it will be fine
result = eval(values)
# Checking if our number is a float and is a whole number.
# If it is a whole number it will remove the .0
# else return the number as is
if isinstance(result, float):
result = Decimal(result).normalize()
else:
result = result
# Clear the entry field and insert the calculation back into the entry field
self.window.entry.delete(0, 'end')
self.window.entry.insert('end', result)
Create the button commands, binds and validation
# Create commands for our buttons
for btn in self.window.btns:
# If the buttons are not = or clear - give the insert command
if btn['text'] not in ['Clear', '=']:
btn['command'] = lambda var=btn['text']: self.insert(var)
elif btn['text'] == 'Clear':
# If the button is the clear button - clear the field
btn['command'] = lambda: self.clear(None)
else:
# Else calculate
btn['command'] = lambda var=btn['text']: self.calculate(var)
# Bind keys to perform some actions
self.window.parent.bind('<Return>', lambda var=btn['text']: self.calculate(var))
self.window.parent.bind('<KP_Enter>', lambda var=btn['text']: self.calculate(var))
self.window.parent.bind('<Escape>', self.clear)
# Validate input - Needs to be numbers or *,+,/,-
valid = self.window.parent.register(self.valid_input)
self.window.entry.configure(validate='key', validatecommand=(valid, '%S'))