
Introduction
We have created a Scientific Calculator in Python which is a fully functional graphical user interface system that contains everything that IT students and computer-related courses will require for their college projects. The project has the same symbols, operators, and numbers as a regular calculator, however, the user cannot enter a number using their keyboard. Python is a computer language that may be used to do mathematical and scientific calculations.
Scientific Calculator in Python using Tkinter: Project Overview
Project Name: | Scientific Calculator in Python using Tkinter |
Abstract | It’s a GUI-based project used with the tkinter module to organize all the elements that work under Scientific Calculator in Python. |
Language/s Used: | Python |
IDE | PyCharm and Thonny(Recommended) |
Python version (Recommended): | Python 3.x |
Database: | Not used |
Type: | Desktop Application |
Recommended for | Beginners in Python and intermediates of Tkinter |
We will mostly understand our codes using comments. Now, let’s start.
Step.1: Importing Libraries and Designing The Buttons
import tkinter as tkfrom math import *# used to switch between units of rad, and degconvert_constant = 1inverse_convert_constant = 1btn_params = {'padx': 16, 'pady': 1, 'bd': 4, 'fg': 'white', 'bg': 'black', 'font': ('arial', 18), 'width': 2, 'height': 2, 'relief': 'flat', 'activebackground': "black"}
In the above code sample, we imported the essential libraries, such as Tkinter, as well as all of the widget classes, including the message box module. This framework allows Python programmers to easily develop GUI components by utilizing the widgets included in the Tk toolkit. Math module for solving mathematical equations. I designed the buttons using the button function.
Step.2: Defining the Functions of the Calculator
#Functions for the buttonsdef 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))
Here we define some functions to implement the Sin, Cos, Tan, Sin-¹, Cos-¹, Tan-¹. To do that we use some predefine python functions such as Sin(), Cos(), Tan(), asin(), acos(), atan().
Step.3: Creating a Display of Calculator
# Here are the methods inside class for all the Buttons in the Scientific Calculator.class Calculator:def __init__(self, master):# expression that will be displayed on screenself.expression = ""# be used to store data in memoryself.recall = ""# self.answerself.sum_up = ""# create string for text inputself.text_input = tk.StringVar()# assign instance to masterself.master = master# set frame showing inputs and titletop_frame = tk.Frame(master, width=650, height=10,bd=10, relief='flat', bg='gray')top_frame.pack(side=tk.TOP)# set frame showing all buttonsbottom_frame = tk.Frame(master, width=650, height=470, bd=2, relief='flat', bg='black')bottom_frame.pack(side=tk.BOTTOM)# Here is the code for Display of Calculator.# entry interface for inputstxt_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()# row 0# left bracket buttonself.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)# right bracket buttonself.btn_right_brack = tk.Button(bottom_frame, **btn_params, text=")", command=lambda: self.btn_click(')'))self.btn_right_brack.grid(row=0, column=1)# takes e to some exponent that you insert into the functionself.btn_exp = tk.Button(bottom_frame, **btn_params, text="exp", command=lambda: self.btn_click('exp('))self.btn_exp.grid(row=0, column=2)# constant piself.btn_pi = tk.Button(bottom_frame, **btn_params, text="π", command=lambda: self.btn_click('pi'))self.btn_pi.grid(row=0, column=3)# square rootself.btn_sqrt = tk.Button(bottom_frame, **btn_params, text="sqrt", command=lambda: self.btn_click('sqrt('))self.btn_sqrt.grid(row=0, column=4)# clears self.expressionself.btn_clear = tk.Button(bottom_frame, **btn_params, text="C", command=self.btn_clear_all)self.btn_clear.grid(row=0, column=5)# deletes last string inputself.btn_del = tk.Button(bottom_frame, **btn_params, text="AC", command=self.btn_clear1)self.btn_del.grid(row=0, column=6)# inputs a negative sign to the next entryself.btn_change_sign = tk.Button(bottom_frame, **btn_params, text="+/-", command=self.change_signs)self.btn_change_sign.grid(row=0, column=7)# divisionself.btn_div = tk.Button(bottom_frame, **btn_params, text="/", command=lambda: self.btn_click('/'))self.btn_div.grid(row=0, column=8)# row 1# changes trig function outputs to degreesself.btn_Deg = tk.Button(bottom_frame, **btn_params, activeforeground='gray', text="Deg", command=self.convert_deg)self.btn_Deg.grid(row=1, column=0)# changes trig function outputs to default back to radiansself.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)# cubes a valueself.cube = tk.Button(bottom_frame, **btn_params, text=u"x\u00B3", command=lambda: self.btn_click('**3'))self.cube.grid(row=1, column=2)# takes the absolute value of an expressionself.btn_abs = tk.Button(bottom_frame, **btn_params, text="abs", command=lambda: self.btn_click('abs' + '('))self.btn_abs.grid(row=1, column=3)# 'memory clear' button. Wipes self.recall to an empty stringself.btn_MC = tk.Button(bottom_frame, **btn_params, text="MC", command=self.memory_clear)self.btn_MC.grid(row=1, column=4)# sevenself.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)# eightself.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)# nineself.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)# multiplicationself.btn_mult = tk.Button(bottom_frame, **btn_params, text="x", command=lambda: self.btn_click('*'))self.btn_mult.grid(row=1, column=8)# row 2# sin function that returns value from -1 to 1 by defaultself.btn_sin = tk.Button(bottom_frame, **btn_params, text="sin", command=lambda: self.btn_click('fsin('))self.btn_sin.grid(row=2, column=0)# cos function that returns value from -1 to 1 by defaultself.btn_cos = tk.Button(bottom_frame, **btn_params, text="cos", command=lambda: self.btn_click('fcos('))self.btn_cos.grid(row=2, column=1)# tan functionself.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)# outputs what is in self.recallself.btn_MR = tk.Button(bottom_frame, **btn_params, text="MR", command=self.memory_recall)self.btn_MR.grid(row=2, column=4)# fourself.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)# fiveself.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)# sixself.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)# subtractionself.btnSub = tk.Button(bottom_frame, **btn_params, text="-", command=lambda: self.btn_click('-'))self.btnSub.grid(row=2, column=8)# row 3# sin inverse functionself.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)# cos inverse functionself.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)# tan inverse functionself.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)# takes the natural logself.btn_ln = tk.Button(bottom_frame, **btn_params, text="ln", command=lambda: self.btn_click('log1p('))self.btn_ln.grid(row=3, column=3)# adds current self.expression to self.recall stringself.btn_M_plus = tk.Button(bottom_frame, **btn_params, text="M+", command=self.memory_add)self.btn_M_plus.grid(row=3, column=4)# oneself.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)# twoself.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)# threeself.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)# additionself.btn_add = tk.Button(bottom_frame, **btn_params, text="+", command=lambda: self.btn_click('+'))self.btn_add.grid(row=3, column=8)# row 4# factorial functionself.btn_fact = tk.Button(bottom_frame, **btn_params, text="n!", command=lambda: self.btn_click('factorial('))self.btn_fact.grid(row=4, column=0)# square functionself.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)# to the power of functionself.btn_power = tk.Button(bottom_frame, **btn_params, text="x^y", command=lambda: self.btn_click('**'))self.btn_power.grid(row=4, column=2)# stores previous expression as an answer valueself.btn_ans = tk.Button(bottom_frame, **btn_params, text="ans", command=self.answer)self.btn_ans.grid(row=4, column=3)# comma to allow for more than one parameter!self.btn_comma = tk.Button(bottom_frame, **btn_params, text=",", command=lambda: self.btn_click(','))self.btn_comma.grid(row=4, column=4)# zeroself.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)# equals buttonself.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)# decimal to convert to floatself.btn_dec = tk.Button(bottom_frame, **btn_params, text=".", command=lambda: self.btn_click('.'))self.btn_dec.grid(row=4, column=8)
We created a Calculator class with the following instance variables: ‘op’ (stores the current operator clicked by the user), ‘M’ (stores memory), ‘isTrue 2nd’ (stores True if ‘2nd’ is clicked and activates the second set of scientific functions like sin-1, 10x. ex, y x in place of sin, log, ln, xy), ‘is degree’ (True if ‘deg’ is on, takes radians for trigonometric operations when ‘deg’ is clicked to ‘rad’ and is degree = False) and ‘decimal clicked’ (turns True when user clicks ‘.’)
Step.4: Create functions for the buttons in Calculator
# allows button you click to be put into self.expressiondef btn_click(self, expression_val):if len(self.expression) >= 23:self.expression = self.expressionself.text_input.set(self.expression)else:self.expression = self.expression + str(expression_val)self.text_input.set(self.expression)# clears last item in stringdef btn_clear1(self):self.expression = self.expression[:-1]self.text_input.set(self.expression)# adds in a negative signdef change_signs(self):self.expression = self.expression + '-'self.text_input.set(self.expression)# clears memory_recalldef memory_clear(self):self.recall = ""# adds whatever is on the screen to self.recalldef memory_add(self):self.recall = self.recall + '+' + self.expression# uses whatever is stored in memory_recalldef answer(self):self.answer = self.sum_upself.expression = self.expression + self.answerself.text_input.set(self.expression)# uses whatever is stored in memory_recalldef memory_recall(self):if self.expression == "":self.text_input.set('0' + self.expression + self.recall)else:self.text_input.set(self.expression + self.recall)# changes self.convert_constant to a string that allows degree conversion when button is clickeddef convert_deg(self):global convert_constantglobal inverse_convert_constantconvert_constant = pi / 180inverse_convert_constant = 180 / piself.btn_Rad["foreground"] = 'White'self.btn_Deg["foreground"] = 'RED'def convert_rad(self):global convert_constantglobal inverse_convert_constantconvert_constant = 1inverse_convert_constant = 1self.btn_Rad["foreground"] = 'RED'self.btn_Deg["foreground"] = 'white'# clears self.expressiondef btn_clear_all(self):self.expression = ""self.text_input.set("")# converts self.expression into a mathematical expression and evaluates itdef btn_equal(self):self.sum_up = str(eval(self.expression))self.text_input.set(self.sum_up)self.expression = self.sum_up
Step.5: Making Tkinter Layout
# tkinter layoutroot = tk.Tk()b = Calculator(root)root.title("Scientific Calculator!")root.geometry("650x490+50+50")root.resizable(False, False)root.mainloop()
In the end, it is time to start designing the program’s graphical user interface for our Scientific Calculator in Python using Tkinter. We will begin by launching Tkinter and creating a window for the Scientific calculator. In this case, we set the window size to 650×490+50+50, and the window resizability to false.
Complete code for Scientific Calculator in Python using Tkinter
import tkinter as tkfrom math import *# used to switch between units of rad, and degconvert_constant = 1inverse_convert_constant = 1btn_params = {'padx': 16, 'pady': 1, 'bd': 4, 'fg': 'white', 'bg': 'black', 'font': ('arial', 18),'width': 2, 'height': 2, 'relief': 'flat', 'activebackground': "black"}#Functions for the buttonsdef 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))# Here are the methods inside class for all the Buttons in the Scientific Calculator.class Calculator:def __init__(self, master):# expression that will be displayed on screenself.expression = ""# be used to store data in memoryself.recall = ""# self.answerself.sum_up = ""# create string for text inputself.text_input = tk.StringVar()# assign instance to masterself.master = master# set frame showing inputs and titletop_frame = tk.Frame(master, width=650, height=10,bd=10, relief='flat', bg='gray')top_frame.pack(side=tk.TOP)# set frame showing all buttonsbottom_frame = tk.Frame(master, width=650, height=470, bd=2, relief='flat', bg='black')bottom_frame.pack(side=tk.BOTTOM)# Here is the code for Display of Calculator.# entry interface for inputstxt_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()# row 0# left bracket buttonself.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)# right bracket buttonself.btn_right_brack = tk.Button(bottom_frame, **btn_params, text=")", command=lambda: self.btn_click(')'))self.btn_right_brack.grid(row=0, column=1)# takes e to some exponent that you insert into the functionself.btn_exp = tk.Button(bottom_frame, **btn_params, text="exp", command=lambda: self.btn_click('exp('))self.btn_exp.grid(row=0, column=2)# constant piself.btn_pi = tk.Button(bottom_frame, **btn_params, text="π", command=lambda: self.btn_click('pi'))self.btn_pi.grid(row=0, column=3)# square rootself.btn_sqrt = tk.Button(bottom_frame, **btn_params, text="sqrt", command=lambda: self.btn_click('sqrt('))self.btn_sqrt.grid(row=0, column=4)# clears self.expressionself.btn_clear = tk.Button(bottom_frame, **btn_params, text="C", command=self.btn_clear_all)self.btn_clear.grid(row=0, column=5)# deletes last string inputself.btn_del = tk.Button(bottom_frame, **btn_params, text="AC", command=self.btn_clear1)self.btn_del.grid(row=0, column=6)# inputs a negative sign to the next entryself.btn_change_sign = tk.Button(bottom_frame, **btn_params, text="+/-", command=self.change_signs)self.btn_change_sign.grid(row=0, column=7)# divisionself.btn_div = tk.Button(bottom_frame, **btn_params, text="/", command=lambda: self.btn_click('/'))self.btn_div.grid(row=0, column=8)# row 1# changes trig function outputs to degreesself.btn_Deg = tk.Button(bottom_frame, **btn_params, activeforeground='gray', text="Deg", command=self.convert_deg)self.btn_Deg.grid(row=1, column=0)# changes trig function outputs to default back to radiansself.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)# cubes a valueself.cube = tk.Button(bottom_frame, **btn_params, text=u"x\u00B3", command=lambda: self.btn_click('**3'))self.cube.grid(row=1, column=2)# takes the absolute value of an expressionself.btn_abs = tk.Button(bottom_frame, **btn_params, text="abs", command=lambda: self.btn_click('abs' + '('))self.btn_abs.grid(row=1, column=3)# 'memory clear' button. Wipes self.recall to an empty stringself.btn_MC = tk.Button(bottom_frame, **btn_params, text="MC", command=self.memory_clear)self.btn_MC.grid(row=1, column=4)# sevenself.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)# eightself.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)# nineself.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)# multiplicationself.btn_mult = tk.Button(bottom_frame, **btn_params, text="x", command=lambda: self.btn_click('*'))self.btn_mult.grid(row=1, column=8)# row 2# sin function that returns value from -1 to 1 by defaultself.btn_sin = tk.Button(bottom_frame, **btn_params, text="sin", command=lambda: self.btn_click('fsin('))self.btn_sin.grid(row=2, column=0)# cos function that returns value from -1 to 1 by defaultself.btn_cos = tk.Button(bottom_frame, **btn_params, text="cos", command=lambda: self.btn_click('fcos('))self.btn_cos.grid(row=2, column=1)# tan functionself.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)# outputs what is in self.recallself.btn_MR = tk.Button(bottom_frame, **btn_params, text="MR", command=self.memory_recall)self.btn_MR.grid(row=2, column=4)# fourself.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)# fiveself.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)# sixself.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)# subtractionself.btnSub = tk.Button(bottom_frame, **btn_params, text="-", command=lambda: self.btn_click('-'))self.btnSub.grid(row=2, column=8)# row 3# sin inverse functionself.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)# cos inverse functionself.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)# tan inverse functionself.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)# takes the natural logself.btn_ln = tk.Button(bottom_frame, **btn_params, text="ln", command=lambda: self.btn_click('log1p('))self.btn_ln.grid(row=3, column=3)# adds current self.expression to self.recall stringself.btn_M_plus = tk.Button(bottom_frame, **btn_params, text="M+", command=self.memory_add)self.btn_M_plus.grid(row=3, column=4)# oneself.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)# twoself.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)# threeself.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)# additionself.btn_add = tk.Button(bottom_frame, **btn_params, text="+", command=lambda: self.btn_click('+'))self.btn_add.grid(row=3, column=8)# row 4# factorial functionself.btn_fact = tk.Button(bottom_frame, **btn_params, text="n!", command=lambda: self.btn_click('factorial('))self.btn_fact.grid(row=4, column=0)# square functionself.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)# to the power of functionself.btn_power = tk.Button(bottom_frame, **btn_params, text="x^y", command=lambda: self.btn_click('**'))self.btn_power.grid(row=4, column=2)# stores previous expression as an answer valueself.btn_ans = tk.Button(bottom_frame, **btn_params, text="ans", command=self.answer)self.btn_ans.grid(row=4, column=3)# comma to allow for more than one parameter!self.btn_comma = tk.Button(bottom_frame, **btn_params, text=",", command=lambda: self.btn_click(','))self.btn_comma.grid(row=4, column=4)# zeroself.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)# equals buttonself.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)# decimal to convert to floatself.btn_dec = tk.Button(bottom_frame, **btn_params, text=".", command=lambda: self.btn_click('.'))self.btn_dec.grid(row=4, column=8)# functions# allows button you click to be put into self.expressiondef btn_click(self, expression_val):if len(self.expression) >= 23:self.expression = self.expressionself.text_input.set(self.expression)else:self.expression = self.expression + str(expression_val)self.text_input.set(self.expression)# clears last item in stringdef btn_clear1(self):self.expression = self.expression[:-1]self.text_input.set(self.expression)# adds in a negative signdef change_signs(self):self.expression = self.expression + '-'self.text_input.set(self.expression)# clears memory_recalldef memory_clear(self):self.recall = ""# adds whatever is on the screen to self.recalldef memory_add(self):self.recall = self.recall + '+' + self.expression# uses whatever is stored in memory_recalldef answer(self):self.answer = self.sum_upself.expression = self.expression + self.answerself.text_input.set(self.expression)# uses whatever is stored in memory_recalldef memory_recall(self):if self.expression == "":self.text_input.set('0' + self.expression + self.recall)else:self.text_input.set(self.expression + self.recall)# changes self.convert_constant to a string that allows degree conversion when button is clickeddef convert_deg(self):global convert_constantglobal inverse_convert_constantconvert_constant = pi / 180inverse_convert_constant = 180 / piself.btn_Rad["foreground"] = 'white'self.btn_Deg["foreground"] = 'RED'def convert_rad(self):global convert_constantglobal inverse_convert_constantconvert_constant = 1inverse_convert_constant = 1self.btn_Rad["foreground"] = 'RED'self.btn_Deg["foreground"] = 'white'# clears self.expressiondef btn_clear_all(self):self.expression = ""self.text_input.set("")# converts self.expression into a mathematical expression and evaluates itdef btn_equal(self):self.sum_up = str(eval(self.expression))self.text_input.set(self.sum_up)self.expression = self.sum_up# tkinter layoutroot = tk.Tk()b = Calculator(root)root.title("Scientific Calculator!")root.geometry("650x490+50+50")root.resizable(False, False)root.mainloop()
Output:

Conclusion
In this article, we built a Scientific Calculator in Python using Tkinter and defined what happens when a user interacts with a UI element. Using Frame widgets to create containers/windows in which to arrange UI components. Positioning Button widgets within a Frame widget using Tkinter’s Layout Manager. The grid layout manager was chosen for the Calculator application due to its precision compared to alternative layout techniques.
Also Read:
- Create your own ChatGPT with Python
- Bakery Management System in Python | Class 12 Project
- SQLite | CRUD Operations in Python
- Event Management System Project in Python
- Ticket Booking and Management in Python
- Hostel Management System Project in Python
- Sales Management System Project in Python
- Bank Management System Project in C++
- Python Download File from URL | 4 Methods
- Python Programming Examples | Fundamental Programs in Python
- Spell Checker in Python
- Portfolio Management System in Python
- Stickman Game in Python
- Contact Book project in Python
- Loan Management System Project in Python
- Cab Booking System in Python
- Brick Breaker Game in Python
- Tank game in Python
- GUI Piano in Python
- Ludo Game in Python
- Rock Paper Scissors Game in Python
- Snake and Ladder Game in Python
- Puzzle Game in Python
- Medical Store Management System Project in Python
- Creating Dino Game in Python
- Tic Tac Toe Game in Python
- Test Typing Speed using Python App
- MoviePy: Python Video Editing Library
- Scientific Calculator in Python
- GUI To-Do List App in Python Tkinter