Sunday 24 November 2019

Standard and scientific calculator in python 2.7

from Tkinter import*
import math
import parser
import tkMessageBox

root= Tk()
root.title("Scientific caculator")
root.configure(background ="peach puff")
#root.resizable(width =False, height=False)
root.geometry("480x568+0+0")

calc= Frame(root)
calc.grid()

class Calc():
    def __init__(self):
        self.total = 0
        self.current = ""
        self.input_value = True
        self.check_sum = False
        self.op = ""
        self.result = False

    def numberEnter(self,num):
        self.result = False
        firstnum = txtDisplay.get()
        secondnum = str(num)
        if self.input_value:
            self.current = secondnum
            self.input_value = False
        else:
            if secondnum == '.':
                if secondnum in firstnum:
                    return
            self.current = firstnum + secondnum
        self.display(self.current)

    def sum_of_total(self):
        self.result = True
        self.current = float(self.current)
        if self.check_sum == True:
            self.valid_function()
        else:
            self.total = float(txtDisplay.get())

    def display(self,value):
        txtDisplay.delete(0,END)
        txtDisplay.insert(0,value)

    def valid_function(self):
        if self.op =="add":
            self.total += self.current
        if self.op == "sub":
            self.total -= self.current
        if self.op == "multi":
            self.total *= self.current
        if self.op == "divide":
            self.total /= self.current
        if self.op == "mod":
            self.total %= self.current
        self.input_value = True
        self.check_sum = False
        self.display(self.total)

    def operation(self, op):
        self.current = float(self.current)
        if self.check_sum:
            self.valid_function()
        elif not self.result:
            self.total = self.current
            self.input_value = True
        self.check_sum = True
        self.op = op
        self.result = False

    def Clear_Entry(self):
        self.result = False
        self.current = "0"
        self.display(0)
        self.input_value = True

    def all_Clear_Entry(self):
        self.Clear_Entry()
        self.total = 0

    def MathsPM(self):
        self.result = False
        self.current = -(float(txtDisplay.get()))
        self.display(self.current)

    def squared(self):
        self.result = False
        self.current = math.sqrt(float(txtDisplay.get()))
        self.display(self.current)

    def cos(self):
        self.result = False
        self.current = math.cos(math.radians(float(txtDisplay.get())))
        self.display(self.current)

    def cosh(self):
        self.result = False
        self.current = math.cosh(math.radians(float(txtDisplay.get())))
        self.display(self.current)
     
    def tan(self):
        self.result = False
        self.current = math.tan(math.radians(float(txtDisplay.get())))
        self.display(self.current)
     
    def tanh(self):
        self.result = False
        self.current = math.tanh(math.radians(float(txtDisplay.get())))
        self.display(self.current)

    def sin(self):
        self.result = False
        self.current = math.sin(math.radians(float(txtDisplay.get())))
        self.display(self.current)

    def sinh(self):
        self.result = False
        self.current = math.sinh(math.radians(float(txtDisplay.get())))
        self.display(self.current)

    def log(self):
        self.result = False
        self.current = math.log(float(txtDisplay.get()))
        self.display(self.current)

    def exp(self):
        self.result = False
        self.current = math.exp(float(txtDisplay.get()))
        self.display(self.current)

    def pi(self):
        self.result = False
        self.current = math.pi
        self.display(self.current)

    def tau(self):
        self.result = False
        self.current = math.tau
        self.display(self.current)

    def e(self):
        self.result = False
        self.current = math.e
        self.display(self.current)

    def acosh(self):
        self.result = False
        self.current = math.acosh(float(txtDisplay.get()))
        self.display(self.current)

    def asinh(self):
        self.result = False
        self.current = math.asinh(float(txtDisplay.get()))
        self.display(self.current)

    def exmp1(self):
        self.result = False
        self.current = math.exmp1(float(txtDisplay.get()))
        self.display(self.current)

    def lgamma(self):
        self.result = False
        self.current = math.lgamma(float(txtDisplay.get()))
        self.display(self.current)

    def degrees(self):
        self.result = False
        self.current = math.degrees(float(txtDisplay.get()))
        self.display(self.current)

    def log2(self):
        self.result = False
        self.current = math.log2(float(txtDisplay.get()))
        self.display(self.current)

    def log10(self):
        self.result = False
        self.current = math.log10(float(txtDisplay.get()))
        self.display(self.current)

    def log1p(self):
        self.result = False
        self.current = math.log1p(float(txtDisplay.get()))
        self.display(self.current)

added_value = Calc()

txtDisplay = Entry(calc ,font=('arial',20,'bold'),bg = "snow", bd=30 , width =28,justify=RIGHT)
txtDisplay.grid(row=0 ,column=0,columnspan=4,pady=1)
txtDisplay.insert(0,"0")

numberpad = "789456123"
i =0
btn =[]
for j in range(2,5):
    for k in range(3):
        btn.append(Button(calc,width=6,height=2,font=('arial',20,'bold'),bd=4, text =numberpad[i]))
        btn[i].grid(row =j , column =k, pady =1)
        btn[i]["command"]=lambda x = numberpad[i]: added_value.numberEnter(x)
        i +=1
     
#====================================Standard======================================================
btnClear= Button(calc, text ="C",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                     command = added_value.Clear_Entry).grid(row=1 , column=0,pady=1)

btnAllClear= Button(calc, text ="CE",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                     command = added_value.all_Clear_Entry).grid(row=1 , column=1,pady=1)

btnsq= Button(calc, text ="√",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                     command = added_value.squared).grid(row=1 , column=2,pady=1)

btnAdd= Button(calc, text ="+",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                     command = lambda : added_value.operation("add")).grid(row=1 , column=3,pady=1)

btnSub= Button(calc, text ="-",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                     command = lambda : added_value.operation("sub")).grid(row=2 , column=3,pady=1)

btnMult= Button(calc, text ="*",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                     command = lambda : added_value.operation("multi")).grid(row=3 , column=3,pady=1)

btnDiv= Button(calc, text =chr(247),width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                     command = lambda : added_value.operation("divide")).grid(row=4 , column=3,pady=1)

btnZero= Button(calc, text ="0",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                     command = lambda : added_value.numberEnter(0)).grid(row=5 , column=0,pady=1)

btnDot= Button(calc, text =".",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                     command = lambda : added_value.numberEnter(".")).grid(row=5 , column=1,pady=1)

btnPM= Button(calc, text =chr(177),width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                     command = added_value.MathsPM).grid(row=5 , column=2,pady=1)

btnEquals= Button(calc, text ="=",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                     command = added_value.sum_of_total).grid(row=5 , column=3,pady=1)

#=========================================Scientific================================================

btnPi= Button(calc, text ="π",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                command = added_value.pi).grid(row=1 , column=4,pady=1)

btnCos= Button(calc, text = "cos",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                command = added_value.cos).grid(row=1 , column=5,pady=1)

btntan= Button(calc, text = "tan",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                command = added_value.tan).grid(row=1 , column=6,pady=1)

btnsin= Button(calc, text ="sin",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                command = added_value.sin).grid(row=1 , column=7,pady=1)

#========================================Scientific==================================================
btn2pi= Button(calc, text ="2π",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                 command = added_value.tau).grid(row=2 , column=4,pady=1)

btnCosh= Button(calc, text ="cosh", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                 command = added_value.cosh).grid(row=2 , column=5,pady=1)

btntanh= Button(calc, text ="tanh", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                 command = added_value.tanh).grid(row=2 , column=6,pady=1)

btnsinh= Button(calc, text ="sinh", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                 command = added_value.sinh).grid(row=2 , column=7,pady=1)
#=========================================Scientific================================================
btnlog= Button(calc, text ="log", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                command = added_value.log).grid(row=3 , column=4,pady=1)

btnExp= Button(calc, text ="Exp", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                command = added_value.exp).grid(row=3 , column=5,pady=1)

btnMod= Button(calc, text ="Mod", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                command = lambda : added_value.operation("mod")).grid(row=3 , column=6,pady=1)

btnE= Button(calc, text ="e",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                command = added_value.e).grid(row=3 , column=7,pady=1)

#=========================================Scientific================================================

btnlog2= Button(calc, text ="log2", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                  command = added_value.log2).grid(row=4 , column=4,pady=1)

btndeg= Button(calc, text ="deg",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                  command = added_value.degrees).grid(row=4 , column=5,pady=1)

btnacosh= Button(calc, text ="acosh", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                  command = added_value.acosh).grid(row=4 , column=6,pady=1)

btnasinh= Button(calc, text ="asinh", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                  command = added_value.asinh).grid(row=4 , column=7,pady=1)

#=========================================Scientific================================================

btnlog10= Button(calc, text ="log10", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                   command = added_value.log10).grid(row=5 , column=4,pady=1)

btnlog1p= Button(calc, text ="deg1p", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                   command = added_value.log1p).grid(row=5 , column=5,pady=1)

btnexpml= Button(calc, text ="expml", width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                   command = added_value.exmp1).grid(row=5 , column=6,pady=1)

btnlgamma= Button(calc, text ="lgamma",width=6,height=2,font=('arial',20,'bold'),bd=4,bg = "peach puff",
                   command = added_value.lgamma).grid(row=5 , column=7,pady=1)

lblDisplay = Label(calc, text="Scientific",font=('arial',30,'bold'),justify= CENTER)
lblDisplay.grid(row =0 , column =4,columnspan=4)

#======================================Menu and function===================================

def iExit():
    iExit = tkinter.messagebox.askyesno("Scientific caculator","Confirm if you want to exit")
    if iExit > 0:
        root.destroy()
    return

def Standard():
    root.resizable(width =False, height=False)
    root.geometry("480x568+0+0")

def Scientific():
    root.resizable(width =False, height=False)
    root.geometry("944x568+0+0")


def HelpView():
    tkinter.messagebox.showinfo("Scientific caculator","Please refer windows calculator for more operation")
 
menubar = Menu(calc)

filemenu = Menu(menubar, tearoff =0)
menubar.add_cascade(label = "File", menu=filemenu)
filemenu.add_command(label = "Standard",command = Standard)
filemenu.add_command(label = "Scientific",command = Scientific)
filemenu.add_command(label = "Exit", command = iExit)

helpmenu = Menu(menubar, tearoff =0)
menubar.add_cascade(label = "Help", menu=helpmenu)
helpmenu.add_command(label = "View Help",command = HelpView)

root.configure(menu=menubar)
root.mainloop()