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 from 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
Python3
# 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 ())
|
Output :
Article Tags :