Empêcher les mauvaises saisies

Exclusif Premium

Débloquez votre potentiel ! ✨

Cette session fait partie de notre programme Premium exclusif

+100h de formations exclusives
+180 exercices de code avancés
+100h de mentorats en réécriture
20 projets guidés pas à pas
Mentorats groupés hebdomadaires
Support individuel avec nos mentors

Prêt à passer au niveau supérieur ?

Découvrez tous les avantages Premium et transformez votre apprentissage dès aujourd'hui!

Inscris-toi

(c'est gratuit !)

Un compte est nécessaire pour participer aux discussions.

Créer un compte

Empêcher les mauvaises saisies

Dans cette partie nous allons rajouter quelques lignes de code pour empêcher de mauvaises saisies.

Par exemple avec notre script actuel il est possible de mettre plusieurs opérateurs à la suite ou de commencer une opération par un opérateur.

Pour commencer nous allons définir une constante au début de notre script qui contient les 4 opérateurs d'addition, soustraction, division et multiplication :

OPERATIONS = ["+", "-", "/", "x"]

Nous rajoutons ensuite deux structures conditionnelles dans la méthode number_or_operation_pressed :

def number_or_operation_pressed(self):
    if self.sender().text() in OPERATIONS:
        # On empêche d'utiliser plusieurs fois de suite un symbole d'opération
        # On empêche de commencer par un symbole d'opération
        if self.result[-1] in OPERATIONS or self.result == "0":
            return

La première structure conditionnelle permet de vérifier si le bouton qui a été cliqué est un bouton d'opération (+, -, / ou x).

On vérifie ensuite si le dernier élément dans le QLineEdit est un symbole d'opération ou si le QLineEdit est égal à 0. Cela permet ainsi d'éviter de taper deux opérateurs à la suite ou de commencer l'opération par un opérateur.

Si l'une ou l'autre des conditions est vérifiée on ne va pas plus loin et on arrête la méthode avec l'instruction return.

Voici le script complet pour cette partie :

from PySide6 import QtCore
from PySide6.QtGui import QShortcut, QKeySequence
from PySide6.QtWidgets import QApplication, QWidget, QGridLayout, QLineEdit, QPushButton

BUTTONS = {"C": (1, 0, 1, 1),
           "/": (1, 3, 1, 1),
           "7": (2, 0, 1, 1),
           "8": (2, 1, 1, 1),
           "9": (2, 2, 1, 1),
           "x": (2, 3, 1, 1),
           "4": (3, 0, 1, 1),
           "5": (3, 1, 1, 1),
           "6": (3, 2, 1, 1),
           "-": (3, 3, 1, 1),
           "1": (4, 0, 1, 1),
           "2": (4, 1, 1, 1),
           "3": (4, 2, 1, 1),
           "+": (4, 3, 1, 1),
           "0": (5, 0, 1, 2),
           ".": (5, 2, 1, 1),
           "=": (5, 3, 1, 1)}

OPERATIONS = ["+", "-", "/", "x"]


class Calculator(QWidget):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Calculatrice")

        self.buttons = {}

        self.main_layout = QGridLayout(self)

        self.le_result = QLineEdit("0")
        self.le_result.setEnabled(False)
        self.main_layout.addWidget(self.le_result, 0, 0, 1, 4)

        for button_text, button_position in BUTTONS.items():
            button = QPushButton(button_text)
            self.main_layout.addWidget(button, *button_position)

            if button_text not in ["=", "C"]:
                button.clicked.connect(self.number_or_operation_pressed)

            self.buttons[button_text] = button

        self.buttons["C"].clicked.connect(self.clear_result)
        self.buttons["="].clicked.connect(self.compute_result)

        self.connect_keyboard_shortcuts()

    @property
    def result(self):
        return self.le_result.text()

    def number_or_operation_pressed(self):
        if self.sender().text() in OPERATIONS:
            # On empêche d'utiliser plusieurs fois de suite un symbole d'opération
            # On empêche de commencer par un symbole d'opération
            if self.result[-1] in OPERATIONS or self.result == "0":
                return

        if self.result == "0":
            self.le_result.clear()

        self.le_result.setText(self.result + self.sender().text())

    def clear_result(self):
        self.le_result.setText("0")

    def compute_result(self):
        try:
            result = eval(self.result.replace("x", "*"))
        except SyntaxError:
            return
        self.le_result.setText(str(result))

    def remove_last_character(self):
        if len(self.result) > 1:
            self.le_result.setText(self.result[:-1])
        else:
            self.le_result.setText("0")

    def connect_keyboard_shortcuts(self):
        for button_text, button in self.buttons.items():
            QShortcut(QKeySequence(button_text), self, button.clicked.emit)

        QShortcut(QKeySequence(QtCore.Qt.Key_Return), self, self.compute_result)
        QShortcut(QKeySequence(QtCore.Qt.Key_Backspace), self, self.remove_last_character)


app = QApplication()
win = Calculator()
win.show()
app.exec()

Ce n'est pas fini...

Tu as complété % du parcours 🔥

Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.

Rechercher sur le site

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.