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 :
defnumber_or_operation_pressed(self):ifself.sender().text()inOPERATIONS:# On empêche d'utiliser plusieurs fois de suite un symbole d'opération# On empêche de commencer par un symbole d'opérationifself.result[-1]inOPERATIONSorself.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 :
fromPySide6importQtCorefromPySide6.QtGuiimportQShortcut,QKeySequencefromPySide6.QtWidgetsimportQApplication,QWidget,QGridLayout,QLineEdit,QPushButtonBUTTONS={"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"]classCalculator(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)forbutton_text,button_positioninBUTTONS.items():button=QPushButton(button_text)self.main_layout.addWidget(button,*button_position)ifbutton_textnotin["=","C"]:button.clicked.connect(self.number_or_operation_pressed)self.buttons[button_text]=buttonself.buttons["C"].clicked.connect(self.clear_result)self.buttons["="].clicked.connect(self.compute_result)self.connect_keyboard_shortcuts()@propertydefresult(self):returnself.le_result.text()defnumber_or_operation_pressed(self):ifself.sender().text()inOPERATIONS:# On empêche d'utiliser plusieurs fois de suite un symbole d'opération# On empêche de commencer par un symbole d'opérationifself.result[-1]inOPERATIONSorself.result=="0":returnifself.result=="0":self.le_result.clear()self.le_result.setText(self.result+self.sender().text())defclear_result(self):self.le_result.setText("0")defcompute_result(self):try:result=eval(self.result.replace("x","*"))exceptSyntaxError:returnself.le_result.setText(str(result))defremove_last_character(self):iflen(self.result)>1:self.le_result.setText(self.result[:-1])else:self.le_result.setText("0")defconnect_keyboard_shortcuts(self):forbutton_text,buttoninself.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()