diff --git a/calculatrice.py b/calculatrice.py new file mode 100644 index 0000000..df14a45 --- /dev/null +++ b/calculatrice.py @@ -0,0 +1,120 @@ +import tkinter as tk + +class Expression: + def __init__(self, valeur, gauche, droite): + self.valeur = valeur + self.gauche = gauche + self.droite = droite + + def evalue(self): + # si c'est un entier on le renvoie + if isinstance(self.valeur, int): + return self.valeur + + # sinon c’est un opérateur + if self.valeur == '+': + return self.gauche.evalue() + self.droite.evalue() + + if self.valeur == '*': + return self.gauche.evalue() * self.droite.evalue() + + def __str__(self): + # si c’est un nombre + if isinstance(self.valeur, int): + return str(self.valeur) + + # sinon on affiche avec parenthèses + return "(" + str(self.gauche) + self.valeur + str(self.droite) + ")" + +def npi2tree(liste): + pile = [] + + for element in liste: + if element == '+' or element == '*': + droite = pile.pop() + gauche = pile.pop() + + exp = Expression(element, gauche, droite) + + pile.append(exp) + + else: + + nombre = int(element) + pile.append(Expression(nombre, None, None)) + + return pile.pop() + +def ajouter(valeur): + entree.insert(tk.END, valeur) + +def effacer(): + entree.delete(0, tk.END) + label_resultat.config(text="Résultat :") + +def calculer(): + try: + expression = entree.get() + liste = expression.split() + arbre = npi2tree(liste) + resultat = arbre.evalue() + label_resultat.config(text="Résultat : " + str(resultat)) + except: + label_resultat.config(text="Erreur") + + +fenetre = tk.Tk() +fenetre.title("Calculatrice NPI") +fenetre.geometry("320x450") +fenetre.resizable(False, False) + +entree = tk.Entry(fenetre, font=("Arial", 16), justify="right") +entree.pack(padx=10, pady=10, fill="x") + +frame = tk.Frame(fenetre) +frame.pack() + +# boutons chiffres 1 à 9 +for i in range(1, 10): + tk.Button(frame, + text=str(i), + width=5, + height=2, + command=lambda x=str(i): ajouter(x) + ).grid(row=(i-1)//3, column=(i-1)%3, padx=5, pady=5) + +# bouton 0 +tk.Button(frame, + text="0", + width=5, + height=2, + command=lambda: ajouter("0") + ).grid(row=3, column=1, padx=5, pady=5) + +tk.Button(frame, text="+", width=5, height=2, + command=lambda: ajouter(" + ")).grid(row=4, column=0, padx=5, pady=5) + +tk.Button(frame, text="*", width=5, height=2, + command=lambda: ajouter(" * ")).grid(row=4, column=1, padx=5, pady=5) + +tk.Button(frame, text="Espace", width=5, height=2, + command=lambda: ajouter(" ")).grid(row=4, column=2, padx=5, pady=5) + +# bouton clear +tk.Button(frame, text="C", width=5, height=2, + command=effacer).grid(row=5, column=0, padx=5, pady=5) + +# bouton égal +tk.Button(frame, text="=", width=12, height=2, + command=calculer).grid(row=5, column=1, columnspan=2, padx=5, pady=5) + +# resultat +label_resultat = tk.Label(fenetre, text="Résultat :", font=("Arial", 14)) +label_resultat.pack(pady=20) + +fenetre.mainloop() + +#exp = "6 4 3 + *" +#calcule = (npi2tree(exp)) +#print(calcule) +#print(calcule.evalue()) \ No newline at end of file