Loan Calculator using PyQt5 in Python

Welcome to this comprehensive guide on building a Loan Calculator using PyQt5 in Python. PyQt5's powerful GUI capabilities allow us to create an intuitive interface for loan calculations with input validation and real-time results.

Introduction to PyQt5

PyQt5 is a cross-platform toolkit for creating desktop applications in Python. It provides Python bindings for Qt libraries, combining Python's simplicity with Qt's robust GUI components. PyQt5 is widely used for developing professional desktop applications.

Loan Calculator Overview

A loan calculator computes monthly payments and total repayment amounts based on loan principal, interest rate, and term. By providing a graphical interface, users can easily input values and view calculated results instantly.

Installation

First, install PyQt5 using pip ?

pip install PyQt5

Basic Loan Calculator

Let's create a simple loan calculator with input fields for loan amount, interest rate, and loan term ?

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout
from PyQt5.QtGui import QDoubleValidator

class LoanCalculator(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()

        # Input fields
        self.amountLabel = QLabel("Loan Amount ($):")
        self.amountLineEdit = QLineEdit()
        self.amountLineEdit.setValidator(QDoubleValidator(0, 1000000, 2))

        self.interestLabel = QLabel("Interest Rate (%):")
        self.interestLineEdit = QLineEdit()
        self.interestLineEdit.setValidator(QDoubleValidator(0, 100, 2))

        self.termLabel = QLabel("Loan Term (years):")
        self.termLineEdit = QLineEdit()
        self.termLineEdit.setValidator(QDoubleValidator(0, 100, 0))

        # Result display
        self.resultLabel = QLabel("Monthly Payment: $0.00")

        # Calculate button
        self.calculateButton = QPushButton("Calculate")
        self.calculateButton.clicked.connect(self.calculateLoan)

        # Add widgets to layout
        layout.addWidget(self.amountLabel)
        layout.addWidget(self.amountLineEdit)
        layout.addWidget(self.interestLabel)
        layout.addWidget(self.interestLineEdit)
        layout.addWidget(self.termLabel)
        layout.addWidget(self.termLineEdit)
        layout.addWidget(self.resultLabel)
        layout.addWidget(self.calculateButton)

        self.setLayout(layout)
        self.setWindowTitle("Loan Calculator")
        self.resize(300, 250)

    def calculateLoan(self):
        try:
            P = float(self.amountLineEdit.text())  # Principal
            r = float(self.interestLineEdit.text()) / 100 / 12  # Monthly rate
            n = float(self.termLineEdit.text()) * 12  # Total months

            # Monthly payment formula: M = P[r(1+r)^n]/[(1+r)^n - 1]
            if r > 0:
                M = P * (r * (1 + r) ** n) / ((1 + r) ** n - 1)
            else:
                M = P / n  # No interest case

            self.resultLabel.setText(f"Monthly Payment: ${M:.2f}")

        except ValueError:
            self.resultLabel.setText("Please enter valid numbers")

def main():
    app = QApplication(sys.argv)
    calculator = LoanCalculator()
    calculator.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Advanced Loan Calculator

This enhanced version calculates both monthly payments and total repayment amounts ?

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, QGridLayout
from PyQt5.QtGui import QDoubleValidator

class AdvancedLoanCalculator(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout()

        # Input section
        inputLayout = QGridLayout()
        
        self.amountLabel = QLabel("Loan Amount ($):")
        self.amountLineEdit = QLineEdit()
        self.amountLineEdit.setValidator(QDoubleValidator(0, 1000000, 2))

        self.interestLabel = QLabel("Interest Rate (%):")
        self.interestLineEdit = QLineEdit()
        self.interestLineEdit.setValidator(QDoubleValidator(0, 100, 2))

        self.termLabel = QLabel("Loan Term (years):")
        self.termLineEdit = QLineEdit()
        self.termLineEdit.setValidator(QDoubleValidator(0, 100, 0))

        inputLayout.addWidget(self.amountLabel, 0, 0)
        inputLayout.addWidget(self.amountLineEdit, 0, 1)
        inputLayout.addWidget(self.interestLabel, 1, 0)
        inputLayout.addWidget(self.interestLineEdit, 1, 1)
        inputLayout.addWidget(self.termLabel, 2, 0)
        inputLayout.addWidget(self.termLineEdit, 2, 1)

        # Results section
        self.monthlyPaymentLabel = QLabel("Monthly Payment: $0.00")
        self.totalRepaymentLabel = QLabel("Total Repayment: $0.00")
        self.totalInterestLabel = QLabel("Total Interest: $0.00")

        # Calculate button
        self.calculateButton = QPushButton("Calculate")
        self.calculateButton.clicked.connect(self.calculateLoan)

        # Add to main layout
        layout.addLayout(inputLayout)
        layout.addWidget(self.monthlyPaymentLabel)
        layout.addWidget(self.totalRepaymentLabel)
        layout.addWidget(self.totalInterestLabel)
        layout.addWidget(self.calculateButton)

        self.setLayout(layout)
        self.setWindowTitle("Advanced Loan Calculator")
        self.resize(350, 300)

    def calculateLoan(self):
        try:
            P = float(self.amountLineEdit.text())  # Principal
            annual_rate = float(self.interestLineEdit.text())
            years = float(self.termLineEdit.text())
            
            r = annual_rate / 100 / 12  # Monthly rate
            n = years * 12  # Total months

            if r > 0:
                M = P * (r * (1 + r) ** n) / ((1 + r) ** n - 1)
            else:
                M = P / n

            total_payment = M * n
            total_interest = total_payment - P

            self.monthlyPaymentLabel.setText(f"Monthly Payment: ${M:.2f}")
            self.totalRepaymentLabel.setText(f"Total Repayment: ${total_payment:.2f}")
            self.totalInterestLabel.setText(f"Total Interest: ${total_interest:.2f}")

        except (ValueError, ZeroDivisionError):
            self.monthlyPaymentLabel.setText("Please enter valid numbers")
            self.totalRepaymentLabel.setText("")
            self.totalInterestLabel.setText("")

def main():
    app = QApplication(sys.argv)
    calculator = AdvancedLoanCalculator()
    calculator.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Loan Calculation Formula

The monthly payment is calculated using the standard loan payment formula ?

M = P * [r(1+r)^n] / [(1+r)^n - 1]

Where:

  • M = Monthly payment

  • P = Principal loan amount

  • r = Monthly interest rate (annual rate รท 12)

  • n = Total number of monthly payments

Key Features

Feature Basic Calculator Advanced Calculator
Input Validation Yes Yes
Monthly Payment Yes Yes
Total Repayment No Yes
Total Interest No Yes
Error Handling Basic Enhanced

Conclusion

PyQt5 provides an excellent framework for creating desktop loan calculators with professional-looking interfaces. The examples demonstrate input validation, loan calculations, and result display. You can extend these applications by adding features like payment schedules, comparison tools, or loan amortization tables.

Updated on: 2026-03-27T08:27:35+05:30

454 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements