Last active
August 29, 2015 14:10
-
-
Save montycheese/b45812e4b036e02051d9 to your computer and use it in GitHub Desktop.
Calculator with Tinkter GUI
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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