Building Calculator using PyQt5 in Python

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
 

GUI implementation steps 

  • 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

Back end implementation steps

  • 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 
 

filter_none

edit
close

play_arrow

link
brightness_4
code

# importing libraries
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui
from 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 app
App = QApplication(sys.argv)
  
# create the instance of our Window
window = Window()
  
# start the app
sys.exit(App.exec())

chevron_right


Output : 
 




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.


Article Tags :

1


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.