A calculator is an object of everyday use and none of us can imagine a life without it.
Therefore, I decided to make a calculator of my own using pyqt5.
PyQt5 is a set of python bindings for the GUI toolkit Qt. It is used as an alternative application development language to C++ on all supported platforms like iOS and android.
The GUI part of the calculator was made using the designer app of PyQt5.
The back-end functions were written in python.
This is a screenshot of how the app looks:
I used the different buttons to create a string containing the equation.
For example: In the above situation, The string I need is “1+1”
Next, I use the eval() function to find the answer to the equation stored in the string.
However, a problem arises. The eval() function in python does not recognise “√” and “^”. Hence, These will cause an error and will stop the program.
I got around this problem using string splicing.
I searched for these symbols and replaced those sections of string with the values of the squares or roots.
For example: The following string: “1 + 2^2 – √4”, would be edited using the program and would result in “1 + 4 – 2”
Following is the program used in editing the string:
def clickEq(self): s = self.Output.text() i = 0 flag = True while i < len(s): if s[i] == "^" or s[i] == "√" : // searching for the symbols if s[i] == "^": //splicing the string according to the “^” format st = s[:i] k = 0 for j in range(len(st)-1,0,-1): if st[j] == " ": k = j break if st[k+1:] != "": st = st[:k] + " " +str(pow(int(st[k:]),2)) + " " else: st = str(pow(int(st[k:]),2)) s = st + s[i+3:] elif s[i] == "√": //splicing the string according to the “√” format sb = s[:i] sf = s[i+1:] k = 0 print (sf) if sf == "-": //avoiding the root of negative numbers fiasco flag = False break for j in range(len(sf)): if sf[j] == " " or j == len(sf)-1: k = j break print(k) st = sf[:k+1] sf = sf[k+1:] print(st) a = math.sqrt(int(st)) print("a = ",a) s = sb + str(a) + sf i+=1 if flag == True: ans = str(eval(s)) // calculating the answer if float(ans) > 1000000000.0: // making sure the final number is not too big font = QtGui.QFont() font.setPointSize(17) self.Output.setFont(font) self.Output.setText("Math Error: Number too large") elif len(ans) > 10: // making sure there are not too many decimal places ans = ans[:10] self.Output.setText(ans) else: self.Output.setText(ans) print(eval(s)) else: //avoiding the root of negative numbers fiasco self.Output.setText("ERROR")
Output is the name of the label used to display the answer. The function for linking a button click to a set function is given below:
I have used “equal” as the name of the button that is supposed to print the answer of the equation.
Following are some screenshots of the calculator working:
The github link for the full program is: