Building Calculator using PyQt5 in Python - GeeksforGeeks

28 May, 2020
In this article we will see how we can create a calculator using PyQt5,A calculator is something used for making mathematical calculations, in particular a small electronic device with a keyboard and a visual display. below is the how the calculator will looks like 
Create a label to show the numbers and the output and set its geometry 
Align the label text fro right side and increase the font size of it 
Create push buttons for the numbers from 0 to 9 and set their geometry in the proper order 
Create operator push button example for addition, subtraction etc 
Add a color effect to the equals button to highlight it
Add action to each button 
Inside the actions of each button except the equals to action, append the text of the label with the respective number or the operator 
Inside the equals to action get the text of the label and start the try except block 
Inside the try block use eval method on the label text to get the ans and set the answer to the label 
Inside the except block set “Wrong Input” as text 
For delete action make the last character removed from the label and for the clear action set the whole text to blank.
Below is the implementation  
# importing librariesfrom PyQt5.QtWidgets import *from PyQt5 import QtCore, QtGuifrom PyQt5.QtGui import *from PyQt5.QtCore import *  import sys    class Window(QMainWindow):      def __init__(self):        super().__init__()          # setting title        self.setWindowTitle("Python ")          # setting geometry        self.setGeometry(100, 100, 360, 350)          # calling method        self.UiComponents()          # showing all the widgets        self.show()          # method for widgets    def UiComponents(self):          # creating a label        self.label = QLabel(self)          # setting geometry to the label        self.label.setGeometry(5, 5, 350, 70)          # creating label multi line        self.label.setWordWrap(True)          # setting style sheet to the label        self.label.setStyleSheet("QLabel"                                 "{"                                 "border : 4px solid black;"                                 "background : white;"                                 "}")          # setting alignment to the label        self.label.setAlignment(Qt.AlignRight)          # setting font        self.label.setFont(QFont('Arial', 15))            # adding number button to the screen        # creating a push button        push1 = QPushButton("1", self)          # setting geometry        push1.setGeometry(5, 150, 80, 40)          # creating a push button        push2 = QPushButton("2", self)          # setting geometry        push2.setGeometry(95, 150, 80, 40)          # creating a push button        push3 = QPushButton("3", self)          # setting geometry        push3.setGeometry(185, 150, 80, 40)          # creating a push button        push4 = QPushButton("4", self)          # setting geometry        push4.setGeometry(5, 200, 80, 40)          # creating a push button        push5 = QPushButton("5", self)          # setting geometry        push5.setGeometry(95, 200, 80, 40)          # creating a push button        push6 = QPushButton("5", self)          # setting geometry        push6.setGeometry(185, 200, 80, 40)          # creating a push button        push7 = QPushButton("7", self)          # setting geometry        push7.setGeometry(5, 250, 80, 40)          # creating a push button        push8 = QPushButton("8", self)          # setting geometry        push8.setGeometry(95, 250, 80, 40)          # creating a push button        push9 = QPushButton("9", self)          # setting geometry        push9.setGeometry(185, 250, 80, 40)          # creating a push button        push0 = QPushButton("0", self)          # setting geometry        push0.setGeometry(5, 300, 80, 40)          # adding operator push button        # creating push button        push_equal = QPushButton("=", self)          # setting geometry        push_equal.setGeometry(275, 300, 80, 40)          # adding equal button a color effect        c_effect = QGraphicsColorizeEffect()        c_effect.setColor(Qt.blue)        push_equal.setGraphicsEffect(c_effect)          # creating push button        push_plus = QPushButton("+", self)          # setting geometry        push_plus.setGeometry(275, 250, 80, 40)          # creating push button        push_minus = QPushButton("-", self)          # setting geometry        push_minus.setGeometry(275, 200, 80, 40)          # creating push button        push_mul = QPushButton("*", self)          # setting geometry        push_mul.setGeometry(275, 150, 80, 40)          # creating push button        push_div = QPushButton("/", self)          # setting geometry        push_div.setGeometry(185, 300, 80, 40)          # creating push button        push_point = QPushButton(".", self)          # setting geometry        push_point.setGeometry(95, 300, 80, 40)            # clear button        push_clear = QPushButton("Clear", self)        push_clear.setGeometry(5, 100, 200, 40)          # del one character button        push_del = QPushButton("Del", self)        push_del.setGeometry(210, 100, 145, 40)          # adding action to each of the button        push_minus.clicked.connect(self.action_minus)        push_equal.clicked.connect(self.action_equal)        push0.clicked.connect(self.action0)        push1.clicked.connect(self.action1)        push2.clicked.connect(self.action2)        push3.clicked.connect(self.action3)        push4.clicked.connect(self.action4)        push5.clicked.connect(self.action5)        push6.clicked.connect(self.action6)        push7.clicked.connect(self.action7)        push8.clicked.connect(self.action8)        push9.clicked.connect(self.action9)        push_div.clicked.connect(self.action_div)        push_mul.clicked.connect(self.action_mul)        push_plus.clicked.connect(self.action_plus)        push_point.clicked.connect(self.action_point)        push_clear.clicked.connect(self.action_clear)        push_del.clicked.connect(self.action_del)        def action_equal(self):          # get the label text        equation = self.label.text()          try:            # getting the ans            ans = eval(equation)              # setting text to the label            self.label.setText(str(ans))          except:            # setting text to the label            self.label.setText("Wrong Input")      def action_plus(self):        # appending label text        text = self.label.text()        self.label.setText(text + " + ")      def action_minus(self):        # appending label text        text = self.label.text()        self.label.setText(text + " - ")      def action_div(self):        # appending label text        text = self.label.text()        self.label.setText(text + " / ")      def action_mul(self):        # appending label text        text = self.label.text()        self.label.setText(text + " * ")      def action_point(self):        # appending label text        text = self.label.text()        self.label.setText(text + ".")      def action0(self):        # appending label text        text = self.label.text()        self.label.setText(text + "0")      def action1(self):        # appending label text        text = self.label.text()        self.label.setText(text + "1")      def action2(self):        # appending label text        text = self.label.text()        self.label.setText(text + "2")      def action3(self):        # appending label text        text = self.label.text()        self.label.setText(text + "3")      def action4(self):        # appending label text        text = self.label.text()        self.label.setText(text + "4")      def action5(self):        # appending label text        text = self.label.text()        self.label.setText(text + "5")      def action6(self):        # appending label text        text = self.label.text()        self.label.setText(text + "6")      def action7(self):        # appending label text        text = self.label.text()        self.label.setText(text + "7")      def action8(self):        # appending label text        text = self.label.text()        self.label.setText(text + "8")      def action9(self):        # appending label text        text = self.label.text()        self.label.setText(text + "9")      def action_clear(self):        # clearing the label text        self.label.setText("")      def action_del(self):        # clearing a single digit        text = self.label.text()        print(text[:len(text)-1])        self.label.setText(text[:len(text)-1])    # create pyqt5 appApp = QApplication(sys.argv)  # create the instance of our Windowwindow = Window()  # start the appsys.exit(App.exec())
Output :  
Python-PyQt
Python
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Box Plot in Python using Matplotlib
Python | Get dictionary keys as a list
Bar Plot in Matplotlib
Multithreading in Python | Set 2 (Synchronization)
Python Dictionary keys() method
loops in python
Python - Call function from another file
Ways to filter Pandas DataFrame by column values
Python | Convert set into a list
Python program to find number of days between two given dates