In this video we’ll finish our calculator’s math buttons using the Python eval() function.
Eval() will take a string and break it apart and evaluate it, ie do the math.
So we don’t have to write code for each of the buttons (add, subtract, multiply, divide), eval will take care of all of it for us.
Python Code: calc.py
GitHub Code: calc.py
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.core.window import Window
# Set the app size
Window.size = (500,700)
# Designate Our .kv design file
Builder.load_file('calc.kv')
class MyLayout(Widget):
def clear(self):
self.ids.calc_input.text = '0'
# Create a button pressing function
def button_press(self, button):
# create a variable that contains whatever was in the text box already
prior = self.ids.calc_input.text
# Test for error first
if "Error" in prior:
prior = ''
# determine if 0 is sitting there
if prior == "0":
self.ids.calc_input.text = ''
self.ids.calc_input.text = f'{button}'
else:
self.ids.calc_input.text = f'{prior}{button}'
# Create Function to remove last character in text box
def remove(self):
prior = self.ids.calc_input.text
# Remove The last item in the textbox
prior = prior[:-1]
# Output back to the textbox
self.ids.calc_input.text = prior
# Create function to make text box positive or negative
def pos_neg(self):
prior = self.ids.calc_input.text
# Test to see if there's a - sign already
if "-" in prior:
self.ids.calc_input.text = f'{prior.replace("-", "")}'
else:
self.ids.calc_input.text = f'-{prior}'
# Create decimal function
def dot(self):
prior = self.ids.calc_input.text
# Split out text box by +
num_list = prior.split("+")
if "+" in prior and "." not in num_list[-1]:
# Add a decimal to the end of the text
prior = f'{prior}.'
# Output back to the text box
self.ids.calc_input.text = prior
elif "." in prior:
pass
else:
# Add a decimal to the end of the text
prior = f'{prior}.'
# Output back to the text box
self.ids.calc_input.text = prior
# create addition function
def math_sign(self, sign):
# create a variable that contains whatever was in the text box already
prior = self.ids.calc_input.text
# slap a plus sign to the text box
self.ids.calc_input.text = f'{prior}{sign}'
# create equals to function
def equals(self):
prior = self.ids.calc_input.text
# Error Handling
try:
# Evaluate the math from the text box
answer = eval(prior)
# Output the answer
self.ids.calc_input.text = str(answer)
except:
self.ids.calc_input.text = "Error"
'''
# Addition
if "+" in prior:
num_list = prior.split("+")
answer = 0.0
# loop thru our list
for number in num_list:
answer = answer + float(number)
# print the answer in the text box
self.ids.calc_input.text = str(answer)
'''
class CalculatorApp(App):
def build(self):
return MyLayout()
if __name__ == '__main__':
CalculatorApp().run()
Kivy Design Code: calc.kv
GitHub Code: calc.kv
<MyLayout>
BoxLayout:
orientation: "vertical"
size: root.width, root.height
TextInput:
id: calc_input
text: "0"
halign: "right"
font_size: 65
size_hint: (1, .15)
GridLayout:
cols: 4
rows: 5
# Row
Button:
size_hint: (.2, .2)
font_size: 32
text: "%"
Button:
size_hint: (.2, .2)
font_size: 32
text: "C"
on_press: root.clear()
Button:
id: clear
size_hint: (.2, .2)
font_size: 32
text: u"\u00AB"
on_press: root.remove()
Button:
size_hint: (.2, .2)
font_size: 32
text: "/"
on_press: root.math_sign("/")
# Row
Button:
size_hint: (.2, .2)
font_size: 32
text: "7"
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.button_press(7)
Button:
size_hint: (.2, .2)
font_size: 32
text: "8"
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.button_press(8)
Button:
size_hint: (.2, .2)
font_size: 32
text: "9"
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.button_press(9)
Button:
size_hint: (.2, .2)
font_size: 32
text: "x"
on_press: root.math_sign("*")
# Row
Button:
size_hint: (.2, .2)
font_size: 32
text: "4"
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.button_press(4)
Button:
size_hint: (.2, .2)
font_size: 32
text: "5"
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.button_press(5)
Button:
size_hint: (.2, .2)
font_size: 32
text: "6"
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.button_press(6)
Button:
size_hint: (.2, .2)
font_size: 32
text: "-"
on_press: root.math_sign("-")
# Row
Button:
size_hint: (.2, .2)
font_size: 32
text: "1"
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.button_press(1)
Button:
size_hint: (.2, .2)
font_size: 32
text: "2"
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.button_press(2)
Button:
size_hint: (.2, .2)
font_size: 32
text: "3"
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.button_press(3)
Button:
size_hint: (.2, .2)
font_size: 32
text: "+"
on_press: root.math_sign("+")
# Row
Button:
size_hint: (.2, .2)
font_size: 32
text: "+/-"
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.pos_neg()
Button:
size_hint: (.2, .2)
font_size: 32
text: "0"
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.button_press(0)
Button:
size_hint: (.2, .2)
font_size: 32
text: "."
background_color: (157/255, 157/255, 157/255, 1)
on_press: root.dot()
Button:
size_hint: (.2, .2)
font_size: 32
text: "="
on_press: root.equals()

Add comment