Créer un convertisseur de change en Python PyQt5

1. Présentation du projet

Étape 1
Reprendre l'article précédent: Convertisseur de devises en Python et enregistrer le code qui contient les méthodes: get_exchange_rates() et convert_currency()dans un fichier python exchangeConverter.py  au sein d'un dossier nommé currency-converter/

Étape 2

A l'aide de Qt Designer, créer l'interface library.ui suivante qui demande à l'utilisateur de

  1. Choisir la devise d'entrée (base currency ) et la devise de sortie ( Target Currency)  via un widget QComboBox,
  2. Un champ QLineEdit() pour saisir la valeur de la devise à convertir (base currency) et un autre champ QLineEdit()  destiné à afficher la valeur de la devise convertie (Target Value)
  3. Un QLabel nommée lbl_result destiné à afficher le taux de change de la devise
  4. Finalement un QPushButton nommé btn_validate pour valider l'opération et un autre btn_cancel pour annuler l'opération comme le montre la figure suivante tout en respectant le nommage des widgets:
    • Widget N° 1 :  comboBox_base_currency
    • Widget N° 2 :  comboBox_target_currency
    • Widget N° 3 :  lineEdit_base_currency
    • Widget N° 4 :  lineEdit_target_value
    • Widget N° 5 : lbl_result
    • Widget N° 6 : btn_validate
    • Widget N° 7 : btn_cancel
  5. Créer le fichier library.py : à l'aide de l'invite de commande cmd, naviguer jusqu'au fichier library.ui et taper la commande:
pyuic5 -x library.ui -o library.py

Cette dernière génerera un fichier library.py qui contient le code de l'interface utilisateur.
Vous obtenez ainsi l'arborescence finale du projet:

currency-converter/
                   exchangeConverter.py
                   library.py
                   library.ui
                   main.py

 

Étape 3

Créer un autre fichier nommé main.py sur lequel :

  1. Importer le contenu des deux fichiers library.py et exchangeConverter.py
  2. Codez la méthode btn_action() qui réalise l'action du bouton btn_validate. 

2. Solution

Étape 1
Code du fichier exchangeConverter.py

import requests

def get_exchange_rates(base_currency):
    url = f"https://api.exchangerate-api.com/v4/latest/{base_currency}"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        return None
 
def convert_currency(base_currency, target_currency, amount):
    data = get_exchange_rates(base_currency)
    if data:
        rates = data['rates']
        if target_currency in rates:
            rate = rates[target_currency]
            converted_amount = amount * rate
            return converted_amount
        else:
            print(f"Taux de conversion pour {target_currency} non disponible.")
            return None
    else:
        print("Erreur lors de la récupération des taux de change.")
        return None




Étape 2

Code du fichier library.py généré par Qt Designer

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(622, 343)
        self.verticalLayoutWidget = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(-20, 0, 681, 81))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label_2 = QtWidgets.QLabel(self.verticalLayoutWidget)
        font = QtGui.QFont()
        font.setPointSize(28)
        font.setBold(True)
        font.setWeight(75)
        self.label_2.setFont(font)
        self.label_2.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label_2.setAutoFillBackground(False)
        self.label_2.setStyleSheet("background-color: rgb(13, 32, 141);\n"
"color: rgb(255, 255, 255);")
        self.label_2.setObjectName("label_2")
        self.verticalLayout.addWidget(self.label_2)
        self.btn_validate = QtWidgets.QPushButton(Form)
        self.btn_validate.setGeometry(QtCore.QRect(370, 290, 231, 31))
        font = QtGui.QFont()
        font.setFamily("Verdana")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.btn_validate.setFont(font)
        self.btn_validate.setStyleSheet("color: rgb(0, 0, 255);")
        self.btn_validate.setObjectName("btn_validate")
        self.label_7 = QtWidgets.QLabel(Form)
        self.label_7.setGeometry(QtCore.QRect(130, 230, 191, 20))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(False)
        font.setWeight(50)
        self.label_7.setFont(font)
        self.label_7.setStyleSheet("color: rgb(255, 0, 0);")
        self.label_7.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.label_7.setObjectName("label_7")
        self.lbl_result = QtWidgets.QLabel(Form)
        self.lbl_result.setGeometry(QtCore.QRect(350, 230, 211, 20))
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.lbl_result.setFont(font)
        self.lbl_result.setStyleSheet("color: rgb(255, 0, 0);")
        self.lbl_result.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.lbl_result.setObjectName("lbl_result")
        self.line = QtWidgets.QFrame(Form)
        self.line.setGeometry(QtCore.QRect(20, 250, 581, 20))
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.btn_cancel = QtWidgets.QPushButton(Form)
        self.btn_cancel.setGeometry(QtCore.QRect(130, 290, 231, 31))
        font = QtGui.QFont()
        font.setFamily("Verdana")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.btn_cancel.setFont(font)
        self.btn_cancel.setStyleSheet("color: rgb(0, 0, 255);")
        self.btn_cancel.setObjectName("btn_cancel")
        self.line_2 = QtWidgets.QFrame(Form)
        self.line_2.setGeometry(QtCore.QRect(20, 210, 581, 20))
        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.layoutWidget = QtWidgets.QWidget(Form)
        self.layoutWidget.setGeometry(QtCore.QRect(20, 100, 581, 99))
        self.layoutWidget.setObjectName("layoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.layoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.lineEdit_target_value = QtWidgets.QLineEdit(self.layoutWidget)
        self.lineEdit_target_value.setObjectName("lineEdit_target_value")
        self.gridLayout.addWidget(self.lineEdit_target_value, 1, 3, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(False)
        font.setWeight(50)
        self.label_3.setFont(font)
        self.label_3.setStyleSheet("color: rgb(0, 0, 255);")
        self.label_3.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
        self.label_6 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(False)
        font.setWeight(50)
        self.label_6.setFont(font)
        self.label_6.setStyleSheet("color: rgb(0, 0, 255);")
        self.label_6.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.label_6.setObjectName("label_6")
        self.gridLayout.addWidget(self.label_6, 1, 2, 1, 1)
        self.label_5 = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(False)
        font.setWeight(50)
        self.label_5.setFont(font)
        self.label_5.setStyleSheet("color: rgb(0, 0, 255);")
        self.label_5.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.label_5.setObjectName("label_5")
        self.gridLayout.addWidget(self.label_5, 0, 2, 1, 1)
        self.lineEdit_base_currency = QtWidgets.QLineEdit(self.layoutWidget)
        self.lineEdit_base_currency.setObjectName("lineEdit_base_currency")
        self.gridLayout.addWidget(self.lineEdit_base_currency, 0, 3, 1, 1)
        self.comboBox_target_currency = QtWidgets.QComboBox(self.layoutWidget)
        self.comboBox_target_currency.setObjectName("comboBox_target_currency")
        self.gridLayout.addWidget(self.comboBox_target_currency, 1, 1, 1, 1)
        self.label = QtWidgets.QLabel(self.layoutWidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(False)
        font.setWeight(50)
        self.label.setFont(font)
        self.label.setStyleSheet("color: rgb(0, 0, 255);")
        self.label.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.comboBox_base_currency = QtWidgets.QComboBox(self.layoutWidget)
        self.comboBox_base_currency.setObjectName("comboBox_base_currency")
        self.gridLayout.addWidget(self.comboBox_base_currency, 0, 1, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label_2.setText(_translate("Form", "            Currency Converter"))
        self.btn_validate.setText(_translate("Form", "Validate"))
        self.label_7.setText(_translate("Form", "Currency Exchange Rate  :"))
        self.lbl_result.setText(_translate("Form", "..."))
        self.btn_cancel.setText(_translate("Form", "Cancel"))
        self.label_3.setText(_translate("Form", "Tarjet Currency   "))
        self.label_6.setText(_translate("Form", "   Target Value   "))
        self.label_5.setText(_translate("Form", "    Amount"))
        self.label.setText(_translate("Form", "Base Currency"))

Étape 3

import sys
from library import *
from exchangeConverter import *

def btn_action():
    base_currency = ui.comboBox_base_currency.currentText()
    target_currency = ui.comboBox_target_currency.currentText()
    amount = float(ui.lineEdit_base_currency.text())
    convert_value = convert_currency(base_currency, target_currency, amount)
    convert_value = str(convert_value)
    ui.lineEdit_target_value.setText(convert_value)

    # Compute currency exchange rate
    exchange_rate = str(convert_currency(base_currency, target_currency, 1))
    ui.lbl_result.setText(exchange_rate)



app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)

data_exchange = get_exchange_rates('USD')['rates']
ui.comboBox_base_currency.addItems(list(data_exchange.keys()))
ui.comboBox_target_currency.addItems(list(data_exchange.keys()))
base_currency = ui.lineEdit_base_currency.text()
target_currency = ui.lineEdit_target_value.text()
ui.btn_validate.clicked.connect(btn_action)

Form.show()
sys.exit(app.exec_())

 

 

python project on GitHub-student management system with django

 

 

 

Younes Derfoufi
CRMEF OUJDA

Leave a Reply