Skip to content

Instantly share code, notes, and snippets.

@montycheese
Last active August 29, 2015 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save montycheese/b45812e4b036e02051d9 to your computer and use it in GitHub Desktop.
Save montycheese/b45812e4b036e02051d9 to your computer and use it in GitHub Desktop.
Calculator with Tinkter GUI
from Tkinter import *
from math import *
from time import sleep
import webbrowser
class Calculator():
def __init__(self):
self.root = Tk()
self.root.wm_title("Montana's Calculator")
self.root.geometry("300x300")
self.title = Label(self.root)
self.title.pack(side=TOP)
#where to display calculations
self.el = StringVar()
self.rad_deg = StringVar()
self.rad_deg.set("Degrees") # by default use degrees
self.result = Label(self.root, height = 1, bg = "gray", textvariable = self.el)
self.result.pack(side=TOP, expand = YES, fill = BOTH)
self.button_frame = Frame(self.root)
self.button_frame.pack(side=BOTTOM, expand=YES, fill=BOTH)
#########creating menu##########
self.main_menu = Menu(self.root)
self.root.config(menu = self.main_menu)
fileMenu = Menu(self.main_menu)
#associate it with the window menu system
self.main_menu.add_cascade(label="File", menu=fileMenu)
#creating menu items
fileMenu.add_command(label="New", command= lambda: self.input_number("CE"))
fileMenu.add_separator()
fileMenu.add_command(label="Exit", command=self.close)
helpMenu = Menu(self.root)
self.main_menu.add_cascade(label="Help", menu=helpMenu)
helpMenu.add_command(label="Need a real calculator...?", command=self.open_ext_calc)
helpMenu.add_command(label="Wolfram Alpha", command=self.open_wolfram)
#create button grid
def create_number_buttons(self):
self.button1 = Button(self.button_frame, text="1", command= lambda: self.input_number(1))
self.button1.grid(row=0, column=0)
self.button2 = Button(self.button_frame, text="2", command= lambda: self.input_number(2))
self.button2.grid(row=0, column=1)
self.button3 = Button(self.button_frame, text="3", command= lambda: self.input_number(3))
self.button3.grid(row=0, column=2)
self.button_plus = Button(self.button_frame, text="+", command= lambda: self.input_number(" + "))
self.button_plus.grid(row=0, column=3)
self.button4 = Button(self.button_frame, text="4", command= lambda: self.input_number(4))
self.button4.grid(row=1, column=0)
Button(self.button_frame, text="5", command= lambda: self.input_number(5)).grid(row=1, column=1)
Button(self.button_frame, text="6", command= lambda: self.input_number(6)).grid(row=1, column=2)
Button(self.button_frame, text="-", command= lambda: self.input_number(" - ")).grid(row=1, column=3)
Button(self.button_frame, text="7", command= lambda: self.input_number(7)).grid(row=2, column=0)
Button(self.button_frame, text="8", command= lambda: self.input_number(8)).grid(row=2, column=1)
Button(self.button_frame, text="9", command= lambda: self.input_number(9)).grid(row=2, column=2)
Button(self.button_frame, text="0", command= lambda: self.input_number(0)).grid(row=3, column=0)
Button(self.button_frame, text="=", command= self.calculate).grid(row=4, column=2)
Button(self.button_frame, text="x", command= lambda: self.input_number(" x ")).grid(row=2, column=3)
Button(self.button_frame, text="/", command= lambda: self.input_number(" / ")).grid(row=3, column=3)
Button(self.button_frame, text="+/-", command= lambda: self.input_number("+/-")).grid(row=3, column=2)
Button(self.button_frame, text=".", command= lambda: self.input_number(".")).grid(row=3, column=1)
Button(self.button_frame, text="CE", command= lambda: self.input_number("CE")).grid(row=4, column=0)
Button(self.button_frame, text="DEL", command = lambda: self.input_number("DEL")).grid(row=4,column=1)
Button(self.button_frame, text="^", command = lambda: self.input_number("^")).grid(row=4,column=3)
Button(self.button_frame, text="Sqrt", command = lambda: self.input_number("Sqrt")).grid(row=0,column=4)
Button(self.button_frame, text="Pi", command = lambda: self.input_number("Pi")).grid(row=1, column=4)
Button(self.button_frame, text="Sin", command = lambda: self.input_number("Sin")).grid(row=2, column=4)
Button(self.button_frame, text="Cos", command = lambda: self.input_number("Cos")).grid(row=3, column=4)
Button(self.button_frame, text="Tan", command = lambda: self.input_number("Tan")).grid(row=4, column=4)
Button(self.button_frame, text="(", command = lambda: self.input_number("(")).grid(row=0, column=5)
Button(self.button_frame, text=")", command = lambda: self.input_number(")")).grid(row=1, column=5)
Button(self.button_frame, text="e", command = lambda: self.input_number("e")).grid(row=2, column=5)
def create_radio_buttons(self):
Radiobutton(self.root, text="Radians", variable=self.rad_deg, value="Radians").pack(side=RIGHT, anchor=W)
Radiobutton(self.root,text="Degrees", variable=self.rad_deg, value="Degrees").pack(side=RIGHT, anchor=W)
def calculate(self):
user_input = self.el.get()
val = 0.0
# if input is only numbers
if (user_input.isalnum()):
print "All numbers"
pass
#If last input was a modifier
elif (user_input.strip()[len(user_input)-2:] == "+") or (user_input.strip() == "+") or (user_input.strip()[len(user_input)-2:] == "-") or (user_input.strip() == "-") or (user_input.strip()[len(user_input)-2:] == "/") or (user_input.strip() == "/") or (user_input.strip()[len(user_input)-2:] == "*") or (user_input.strip() == "*") or (user_input == ".") or (user_input == "^"):
self.el.set("ERROR")
self.root.update_idletasks()
sleep(1)
self.el.set("")
self.root.update_idletasks()
elif user_input[len(user_input)-1:] == ".":
self.el.set("Cannot have trailing decimal")
self.root.update_idletasks()
sleep(1)
self.el.set(user_input)
self.root.update_idletasks()
#sum
elif user_input.find("+") != -1:
user_input = user_input.replace(" +", "")
last_index_first = user_input.find(" ") - 1
user_input = user_input.replace(" ", "")
first_index_second = last_index_first + 1
val = float(user_input[:last_index_first+1]) + float(user_input[first_index_second:])
self.el.set(val)
self.root.update_idletasks()
#difference
elif (user_input.find("-") != -1 ) and (user_input[user_input.find("-") +1] == " "):
user_input = user_input.replace(" -", "")
last_index_first = user_input.find(" ") - 1
user_input = user_input.replace(" ", "")
first_index_second = last_index_first + 1
val = float(user_input[:last_index_first+1]) - float(user_input[first_index_second:])
self.el.set(val)
self.root.update_idletasks()
#product
elif user_input.find("x") != -1:
user_input = user_input.replace(" x", "")
last_index_first = user_input.find(" ") - 1
user_input = user_input.replace(" ", "")
first_index_second = last_index_first + 1
val = float(user_input[:last_index_first+1]) * float(user_input[first_index_second:])
self.el.set(val)
self.root.update_idletasks()
#division
elif user_input.find("/") != -1:
user_input = user_input.replace(" /", "")
last_index_first = user_input.find(" ") - 1
user_input = user_input.replace(" ", "")
first_index_second = last_index_first + 1
try:
val = float(user_input[:last_index_first+1]) / float(user_input[first_index_second:])
self.el.set(val)
except ZeroDivisionError:
self.el.set("ERROR DIVIDE BY ZERO")
self.root.update_idletasks()
sleep(1)
self.el.set("")
self.root.update_idletasks()
#power
elif user_input.find("^") != -1:
last_index_first = user_input.find("^") - 1
first_index_second = last_index_first + 2
val = float(user_input[:last_index_first+1]) ** float(user_input[first_index_second:])
self.el.set(val)
self.root.update_idletasks()
else:
pass
def input_number(self, arg):
if arg == "CE":
self.el.set("")
elif arg == "DEL":
self.el.set(self.el.get()[:len(self.el.get())-1])
elif arg == "Sqrt":
try:
self.el.set(float(self.el.get())**(0.5))
except ValueError:
self.el.set("Can not take Sqrt of negative number")
self.root.update_idletasks()
sleep(1)
self.el.set("")
elif arg == "Sin":
if self.rad_deg.get() == "Degrees":
self.el.set(degrees(sin(float(self.el.get()))))
else:
self.el.set(sin(float(self.el.get())))
elif arg == "Cos":
if self.rad_deg.get() == "Degrees":
self.el.set(degrees(cos(float(self.el.get()))))
else:
self.el.set(cos(float(self.el.get())))
elif arg == "Tan":
if self.rad_deg.get() == "Degrees":
self.el.set(degrees(tan(float(self.el.get()))))
else:
self.el.set(tan(float(self.el.get())))
elif arg == "Pi":
self.el.set(self.el.get() + "3.14159")
elif arg == "e":
self.el.set(self.el.get() + "2.718281")
elif arg == "(":
pass
elif arg == ")":
pass
elif (arg == "." and self.el.get() == "") or (self.el.get()[len(self.el.get())-1:] == " " and arg == ".") or (self.el.get()[len(self.el.get())-1:] == "^" and arg == "."):
self.el.set(self.el.get() +"0.")
elif (arg == "+/-"):
self.el.set(self.el.get() + "-")
else:
self.el.set(str(self.el.get()) + str(arg))
self.root.update_idletasks()
def open_ext_calc(self):
webbrowser.open("http://web2.0calc.com")
def open_wolfram(self):
webbrowser.open("http://www.wolframalpha.com")
def show_result(self):
print self.el.get()
def close(self):
self.root.destroy()
def show(self):
self.root.mainloop()
if __name__ == "__main__":
calc = Calculator()
calc.create_number_buttons()
calc.create_radio_buttons()
calc.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment