In this video we’ll fix a decimal problem in our calculator app with Kivy and Python.
In the last video we worked on some secondary buttons, including the decimal button. But in doing so, I introduced a small bug that doesn’t allow us to add two different decimal numbers (only one).
In this video we’ll spend a few quick minutes fixing that problem.
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 # 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 # 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