import tkinter as tk
from math import *
convert_constant = 1
inverse_convert_constant = 1
btn_params = {'padx': 16, 'pady': 1, 'bd': 4, 'fg': 'white', 'bg': 'black', 'font': ('arial', 18),
'width': 2, 'height': 2, 'relief': 'flat', 'activebackground': "black"}
def fsin(arg):
return sin(arg * convert_constant)
def fcos(arg):
return cos(arg * convert_constant)
def ftan(arg):
return tan(arg * convert_constant)
def arcsin(arg):
return inverse_convert_constant * (asin(arg))
def arccos(arg):
return inverse_convert_constant * (acos(arg))
def arctan(arg):
return inverse_convert_constant * (atan(arg))
class Calculator:
def __init__(self, master):
self.expression = ""
self.recall = ""
self.sum_up = ""
self.text_input = tk.StringVar()
self.master = master
top_frame = tk.Frame(master, width=650, height=10,
bd=10, relief='flat', bg='gray')
top_frame.pack(side=tk.TOP)
bottom_frame = tk.Frame(
master, width=650, height=470, bd=2, relief='flat', bg='black')
bottom_frame.pack(side=tk.BOTTOM)
txt_display = tk.Entry(top_frame, font=('arial', 36), relief='flat', bg='black', fg='white', textvariable=self.text_input, width=60, bd=12, justify='right')
txt_display.pack()
self.btn_left_brack = tk.Button(
bottom_frame, **btn_params, text="(", border=1, command=lambda: self.btn_click('('))
self.btn_left_brack.grid(row=0, column=0)
self.btn_right_brack = tk.Button(
bottom_frame, **btn_params, text=")", command=lambda: self.btn_click(')'))
self.btn_right_brack.grid(row=0, column=1)
self.btn_exp = tk.Button(
bottom_frame, **btn_params, text="exp", command=lambda: self.btn_click('exp('))
self.btn_exp.grid(row=0, column=2)
self.btn_pi = tk.Button(
bottom_frame, **btn_params, text="π", command=lambda: self.btn_click('pi'))
self.btn_pi.grid(row=0, column=3)
self.btn_sqrt = tk.Button(
bottom_frame, **btn_params, text="sqrt", command=lambda: self.btn_click('sqrt('))
self.btn_sqrt.grid(row=0, column=4)
self.btn_clear = tk.Button(
bottom_frame, **btn_params, text="C", command=self.btn_clear_all)
self.btn_clear.grid(row=0, column=5)
self.btn_del = tk.Button(
bottom_frame, **btn_params, text="AC", command=self.btn_clear1)
self.btn_del.grid(row=0, column=6)
self.btn_change_sign = tk.Button(
bottom_frame, **btn_params, text="+/-", command=self.change_signs)
self.btn_change_sign.grid(row=0, column=7)
self.btn_div = tk.Button(
bottom_frame, **btn_params, text="/", command=lambda: self.btn_click('/'))
self.btn_div.grid(row=0, column=8)
self.btn_Deg = tk.Button(bottom_frame, **btn_params, activeforeground='gray', text="Deg", command=self.convert_deg)
self.btn_Deg.grid(row=1, column=0)
self.btn_Rad = tk.Button(bottom_frame, **btn_params, foreground='white', activeforeground='Gray', text="Rad", command=self.convert_rad)
self.btn_Rad.grid(row=1, column=1)
self.cube = tk.Button(bottom_frame, **btn_params, text=u"x\u00B3", command=lambda: self.btn_click('**3'))
self.cube.grid(row=1, column=2)
self.btn_abs = tk.Button(
bottom_frame, **btn_params, text="abs", command=lambda: self.btn_click('abs' + '('))
self.btn_abs.grid(row=1, column=3)
self.btn_MC = tk.Button(
bottom_frame, **btn_params, text="MC", command=self.memory_clear)
self.btn_MC.grid(row=1, column=4)
self.btn_7 = tk.Button(bottom_frame, **btn_params, text="7", command=lambda: self.btn_click(7))
self.btn_7.configure(activebackground="black", bg='black')
self.btn_7.grid(row=1, column=5)
self.btn_8 = tk.Button(bottom_frame, **btn_params, text="8", command=lambda: self.btn_click(8))
self.btn_8.configure(activebackground="black", bg='black')
self.btn_8.grid(row=1, column=6)
self.btn_9 = tk.Button(bottom_frame, **btn_params, text="9", command=lambda: self.btn_click(9))
self.btn_9.configure(activebackground="black", bg='black')
self.btn_9.grid(row=1, column=7)
self.btn_mult = tk.Button(bottom_frame, **btn_params, text="x", command=lambda: self.btn_click('*'))
self.btn_mult.grid(row=1, column=8)
self.btn_sin = tk.Button(
bottom_frame, **btn_params, text="sin", command=lambda: self.btn_click('fsin('))
self.btn_sin.grid(row=2, column=0)
self.btn_cos = tk.Button(
bottom_frame, **btn_params, text="cos", command=lambda: self.btn_click('fcos('))
self.btn_cos.grid(row=2, column=1)
self.btn_tan = tk.Button(bottom_frame, **btn_params, text="tan", command=lambda: self.btn_click('ftan('))
self.btn_tan.grid(row=2, column=2)
self.btn_log = tk.Button(bottom_frame, **btn_params, text="log", command=lambda: self.btn_click('log('))
self.btn_log.grid(row=2, column=3)
self.btn_MR = tk.Button(bottom_frame, **btn_params, text="MR", command=self.memory_recall)
self.btn_MR.grid(row=2, column=4)
self.btn_4 = tk.Button(bottom_frame, **btn_params, text="4", command=lambda: self.btn_click(4))
self.btn_4.configure(activebackground="black", bg='black')
self.btn_4.grid(row=2, column=5)
self.btn_5 = tk.Button(bottom_frame, **btn_params, text="5", command=lambda: self.btn_click(5))
self.btn_5.configure(activebackground="black", bg='black')
self.btn_5.grid(row=2, column=6)
self.btn_6 = tk.Button(bottom_frame, **btn_params, text="6", command=lambda: self.btn_click(6))
self.btn_6.configure(activebackground="black", bg='black')
self.btn_6.grid(row=2, column=7)
self.btnSub = tk.Button(bottom_frame, **btn_params, text="-", command=lambda: self.btn_click('-'))
self.btnSub.grid(row=2, column=8)
self.btn_sin_inverse = tk.Button(bottom_frame, **btn_params, text=u"sin-\u00B9", command=lambda: self.btn_click('arcsin('))
self.btn_sin_inverse.grid(row=3, column=0)
self.btn_cos_inverse = tk.Button(bottom_frame, **btn_params, text=u"cos-\u00B9", command=lambda: self.btn_click('arccos('))
self.btn_cos_inverse.grid(row=3, column=1)
self.btn_tan_inverse = tk.Button(bottom_frame, **btn_params, text=u"tan-\u00B9", command=lambda: self.btn_click('arctan('))
self.btn_tan_inverse.grid(row=3, column=2)
self.btn_ln = tk.Button(bottom_frame, **btn_params, text="ln", command=lambda: self.btn_click('log1p('))
self.btn_ln.grid(row=3, column=3)
self.btn_M_plus = tk.Button(bottom_frame, **btn_params, text="M+", command=self.memory_add)
self.btn_M_plus.grid(row=3, column=4)
self.btn_1 = tk.Button(bottom_frame, **btn_params, text="1", command=lambda: self.btn_click(1))
self.btn_1.configure(activebackground="black", bg='black')
self.btn_1.grid(row=3, column=5)
self.btn_2 = tk.Button(bottom_frame, **btn_params, text="2", command=lambda: self.btn_click(2))
self.btn_2.configure(activebackground="black", bg='black')
self.btn_2.grid(row=3, column=6)
self.btn_3 = tk.Button(bottom_frame, **btn_params, text="3", command=lambda: self.btn_click(3))
self.btn_3.configure(activebackground="black", bg='black')
self.btn_3.grid(row=3, column=7)
self.btn_add = tk.Button(
bottom_frame, **btn_params, text="+", command=lambda: self.btn_click('+'))
self.btn_add.grid(row=3, column=8)
self.btn_fact = tk.Button(bottom_frame, **btn_params, text="n!", command=lambda: self.btn_click('factorial('))
self.btn_fact.grid(row=4, column=0)
self.btn_sqr = tk.Button(bottom_frame, **btn_params, text=u"x\u00B2", command=lambda: self.btn_click('**2'))
self.btn_sqr.grid(row=4, column=1)
self.btn_power = tk.Button(bottom_frame, **btn_params, text="x^y", command=lambda: self.btn_click('**'))
self.btn_power.grid(row=4, column=2)
self.btn_ans = tk.Button(bottom_frame, **btn_params, text="ans", command=self.answer)
self.btn_ans.grid(row=4, column=3)
self.btn_comma = tk.Button(bottom_frame, **btn_params, text=",", command=lambda: self.btn_click(','))
self.btn_comma.grid(row=4, column=4)
self.btn_0 = tk.Button(bottom_frame, **btn_params, text="0", command=lambda: self.btn_click(0))
self.btn_0.configure(activebackground="black", bg='black', width=7, bd=5)
self.btn_0.grid(row=4, column=5, columnspan=2)
self.btn_eq = tk.Button(bottom_frame, **btn_params, text="=", command=self.btn_equal)
self.btn_eq.configure(bg='Gray', activebackground='#009999')
self.btn_eq.grid(row=4, column=7)
self.btn_dec = tk.Button(bottom_frame, **btn_params, text=".", command=lambda: self.btn_click('.'))
self.btn_dec.grid(row=4, column=8)
def btn_click(self, expression_val):
if len(self.expression) >= 23:
self.expression = self.expression
self.text_input.set(self.expression)
else:
self.expression = self.expression + str(expression_val)
self.text_input.set(self.expression)
def btn_clear1(self):
self.expression = self.expression[:-1]
self.text_input.set(self.expression)
def change_signs(self):
self.expression = self.expression + '-'
self.text_input.set(self.expression)
def memory_clear(self):
self.recall = ""
def memory_add(self):
self.recall = self.recall + '+' + self.expression
def answer(self):
self.answer = self.sum_up
self.expression = self.expression + self.answer
self.text_input.set(self.expression)
def memory_recall(self):
if self.expression == "":
self.text_input.set('0' + self.expression + self.recall)
else:
self.text_input.set(self.expression + self.recall)
def convert_deg(self):
global convert_constant
global inverse_convert_constant
convert_constant = pi / 180
inverse_convert_constant = 180 / pi
self.btn_Rad["foreground"] = 'white'
self.btn_Deg["foreground"] = 'RED'
def convert_rad(self):
global convert_constant
global inverse_convert_constant
convert_constant = 1
inverse_convert_constant = 1
self.btn_Rad["foreground"] = 'RED'
self.btn_Deg["foreground"] = 'white'
def btn_clear_all(self):
self.expression = ""
self.text_input.set("")
def btn_equal(self):
self.sum_up = str(eval(self.expression))
self.text_input.set(self.sum_up)
self.expression = self.sum_up
root = tk.Tk()
b = Calculator(root)
root.title("Scientific Calculator!")
root.geometry("650x490+50+50")
root.resizable(False, False)
root.mainloop()