# Évite les import * : il y a de gros risques de conflits ! # Essaye de respecter le maximum de 80 colonnes sur ton code. # if self.valeur != '+' and ... très lourd. À remplacer par if self.valeur not in '+*/-^' # la méthode __str__ est appelée quand on écrit str(expression), et renvoie une # chaine de caractères. Écrire str(self.gauche.__str__()) est donc redondant : # il suffit d'écrire str(self.gauche). # Dans npi2tree : # tu fais une erreur dans l'ordre des opérations : 2 3 - devrait donner -1, pas 1 # il faudrait aussi gérer les erreurs (par exemple 2 3 5 +) # Dans resultat : # pourquoi convertir deux fois l'expression en arbre ?? # Note : 9.5 / 10 from Pile import Pile_lst from math import * from tkinter import * from tkinter.messagebox import * class Expression: def __init__(self, valeur, gauche, droite): self.valeur = valeur self.gauche = gauche self.droite = droite def evalue(self): """Renvoie la valeur de l'expression""" if self.valeur == '+': return self.gauche.evalue() + self.droite.evalue() elif self.valeur == '*': return self.gauche.evalue() * self.droite.evalue() elif self.valeur == '-': return self.gauche.evalue() - self.droite.evalue() elif self.valeur == '/': return self.gauche.evalue() / self.droite.evalue() elif self.valeur == '//': return self.gauche.evalue() // self.droite.evalue() elif self.valeur == '%': return self.gauche.evalue() % self.droite.evalue() elif self.valeur == '^': return self.gauche.evalue() ** self.droite.evalue() elif self.valeur == 'sqrt': return sqrt(self.gauche.evalue()) elif self.valeur == 'cos': return cos(self.gauche.evalue()) elif self.valeur == 'sin': return sin(self.gauche.evalue()) elif self.valeur == 'tan': return tan(self.gauche.evalue()) else: return self.valeur def __str__(self): if self.valeur != '+' and self.valeur != '*' and self.valeur != '-' and self.valeur != '/' and self.valeur != '//' and self.valeur != '%' and self.valeur != '^' and self.valeur != 'sqrt' and self.valeur != 'cos' and self.valeur != 'sin' and self.valeur != 'tan': return self.valeur elif self.valeur == '+' or self.valeur == '*' or self.valeur == '-' or self.valeur == '/' or self.valeur == '//' or self.valeur =='%' or self.valeur == '^': return "(" + str(self.gauche.__str__()) + str(self.valeur) + str(self.droite.__str__()) + ")" elif self.valeur =='sqrt' or self.valeur == 'cos' or self.valeur == 'sin' or self.valeur == 'tan': return str(self.valeur) + "(" + str(self.gauche.__str__()) + ")" def npi2tree(exp): """Prends en paramètre une ... correspondant à l'expression en notation polonaise inversée et renvoie l'arbre correspondant""" pile_npi = Pile_lst() lst_npi = exp.split() for element in lst_npi: if element == '+' or element == '*' or element == '-' or element == '/' or element == '//' or element == '%' or element == '^': exp_npi = Expression(element, pile_npi.depiler(), pile_npi.depiler()) pile_npi.empiler(exp_npi) elif element == 'sqrt' or element == 'cos' or element == 'sin' or element == 'tan': exp_npi = Expression(element, pile_npi.depiler(), None) pile_npi.empiler(exp_npi) else: exp_feuille = Expression(float(element), None, None) pile_npi.empiler(exp_feuille) return pile_npi.sommet() #------------------------------------------- #Tkinter #------------------------------------------- fenetre = Tk() def resultat(): expr = zonetexte.get() res = npi2tree(expr).evalue() texte2.configure(text=res) affichage = npi2tree(expr) texte4.configure(text=affichage) def legende(): fenetre = Tk() fenetre.title('Légende') cadre1 = LabelFrame(fenetre, text="Opérateur à 2 chiffres", padx=20, pady=20) cadre1.pack(fill="both", expand="yes") cadre2 = LabelFrame(fenetre, text="Opérateur à 1 chiffres", padx=20, pady=20) cadre2.pack(fill="both", expand="yes") texteLeg1 = Label(cadre1, text="Pour faire une addition, taper : << + >>").pack() texteLeg2 = Label(cadre1, text="Pour faire une soustraction, taper : << - >>").pack() texteLeg3 = Label(cadre1, text="Pour faire une multiplication, taper : << * >>").pack() texteLeg4 = Label(cadre1, text="Pour faire une division, taper : << / >>").pack() texteLeg5 = Label(cadre1, text="Pour faire une division entière, taper : << // >>").pack() texteLeg6 = Label(cadre1, text="Pour calculer le modulo, taper : << % >>").pack() texteLeg7 = Label(cadre1, text="Pour calculer 'a' puissance 'b', taper : << ^ >>").pack() texteLeg8 = Label(cadre2, text="Pour calculer la racine carré d'une valeur, taper: << sqrt >>").pack() texteLeg9 = Label(cadre2, text="Pour calculer le cosinus d'une valeur, taper: << cos >>").pack() texteLeg10 = Label(cadre2, text="Pour calculer le sinus d'une valeur, taper: << sin >>").pack() texteLeg11 = Label(cadre2, text="Pour calculer la tangente d'une valeur, taper: << tan >>").pack() zonetexte = Entry(fenetre, width=30) zonetexte.pack() texte1 = Label(fenetre, text="Résultat:") texte1.pack() texte2 = Label(fenetre, text="???") texte2.pack() texte3 = Label(fenetre, text="Expression:") texte3.pack() texte4 = Label(fenetre, text="???") texte4.pack() enregistrer=Button(fenetre, text="Résultat", command=resultat) enregistrer.pack() menubar = Menu(fenetre) menu1 = Menu(menubar, tearoff=0) menu1.add_command(label="Légende", command=legende) menubar.add_cascade(label="Option", menu=menu1) fenetre.config(menu=menubar)