Browse Source

ajout opérateurs;gère assez bien les nombres à virgule;fx trigo;log erreurs pas fonctionnel

master
bollet.c 9 months ago
parent
commit
c70768abba
  1. 4
      expression.py
  2. 126
      test_interface.py

4
expression.py

@ -24,7 +24,7 @@ class Expression:
def __str__(self): def __str__(self):
"""affiche l'expression""" """affiche l'expression"""
#temporaire #temporaire
if self.racine in ["+", "*"]: if self.racine in ["+", "*", "-", "/"]:
return "(" + str(self.gauche) + self.racine + str(self.droit) + ")" return "(" + str(self.gauche) + self.racine + str(self.droit) + ")"
return str(self.racine) return str(self.racine)
@ -34,7 +34,7 @@ def npi2tree(liste_en_npi):
"""conversion d'une liste en NPI en un arbre""" """conversion d'une liste en NPI en un arbre"""
pile_expr = Pile() pile_expr = Pile()
for element in liste_en_npi: for element in liste_en_npi:
if element in ["+", "*"]: if element in ["+", "*","-","/"]:
pile_expr.empiler(Expression(element, pile_expr.depiler(),pile_expr.depiler())) pile_expr.empiler(Expression(element, pile_expr.depiler(),pile_expr.depiler()))
else: else:
pile_expr.empiler(Expression(element, None, None)) pile_expr.empiler(Expression(element, None, None))

126
test_interface.py

@ -0,0 +1,126 @@
import tkinter as tk
from Pile import Pile_chaine as Pile
from math import *
class ValeurSaisie:
"""classe d'une valeur saise par l'utilisateur"""
def __init__(self, valeur, master):
self.valeur = valeur
self.label_valeur = tk.Label(master, text=valeur)
self.label_valeur.pack()
def __del__(self):
"""suppression du label"""
self.label_valeur.destroy()
class Interface(tk.Frame):
"""interface de la calculatrice"""
def __init__(self, master):
self.master = master
tk.Frame.__init__(self, master)
self.stack = Pile()
self.saisie_expression = tk.Entry(self.master)
self.saisie_expression.pack()
self.saisie_expression.bind("<Return>", lambda e : self.entrer())
self.saisie_expression.bind("<KP_Enter>", lambda e : self.entrer())
self.saisie_expression.bind("+", lambda e : self.evaluer("+",2))
self.saisie_expression.bind("-", lambda e : self.evaluer("-",2))
self.saisie_expression.bind("*", lambda e : self.evaluer("*",2))
self.saisie_expression.bind("/", lambda e : self.evaluer("/",2))
commandes = tk.LabelFrame(self.master, text="commandes", padx=20, pady=20)
commandes.pack(fill="both")
btn_calculer = tk.Button(commandes, text='évaluer', command=self.entrer)
btn_calculer.pack(side="left")
btn_effacer = tk.Button(commandes, text='effacer', command=self.effacer)
btn_effacer.pack(side="left")
btn_sinus = tk.Button(commandes, text='sin', command=lambda : self.evaluer("sin",1))
btn_sinus.pack(side="left")
btn_sinus = tk.Button(commandes, text='cos', command=lambda : self.evaluer("cos",1))
btn_sinus.pack(side="left")
btn_sinus = tk.Button(commandes, text='tan', command=lambda : self.evaluer("tan",1))
btn_sinus.pack(side="left")
btn_pow = tk.Button(commandes, text='^', command=lambda : self.evaluer("^",2))
btn_pow.pack(side="right")
self.affichage_expression = tk.Label(self.master)
self.affichage_expression.pack()
self.frame_stack = tk.Frame(self.master, bg="gray")
self.frame_stack.pack(padx=10, pady=10)
self.error_log = tk.Label(self.master, fg="red")
self.error_log.pack()
def evaluer(self, op, nb_arg):
"""application de l'operation aux nb_arg dernières valeurs du stack"""
self.entrer()
if nb_arg == 1:
val = self.stack.depiler().valeur
if op == "sin":
res = sin(val)
if op == "cos":
res = cos(val)
if op == "tan":
res = tan(val)
elif nb_arg == 2:
try:
droite = self.stack.depiler().valeur
gauche = self.stack.depiler().valeur
except IndexError:
self.error_log.config(text="Il manque un argument")
if op == "+":
res = gauche + droite
if op == "-":
res = gauche - droite
if op == "*":
res = gauche * droite
if op == "/":
res = gauche / droite
if op == "^":
res = gauche ** droite
self.stack.empiler(ValeurSaisie(res, self.frame_stack))
#https://stackoverflow.com/questions/11541262/basic-query-regarding-bindtags-in-tkinter/11542200#11542200
return "break"
def entrer(self):
"""ajoute une nouvelle valeur dans le stack
ajoute un label avec cette valeur"""
valeur_a_ajouter = self.saisie_expression.get().replace(" ", "")
if valeur_a_ajouter != "":
if "." in valeur_a_ajouter:
valeur_a_ajouter = float(valeur_a_ajouter)
else:
valeur_a_ajouter = int(valeur_a_ajouter)
self.stack.empiler(ValeurSaisie(valeur_a_ajouter, self.frame_stack))
self.saisie_expression.delete(0 ,'end')
def effacer(self):
"""supprime tout le contenu de la pile et les labels associés"""
while not self.stack.est_vide():
self.stack.depiler()
if __name__ == "__main__":
root = tk.Tk()
root.title("Calculatrice")
root.geometry("350x500")
hello_frame = Interface(root)
hello_frame.mainloop()
Loading…
Cancel
Save