You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
4.5 KiB

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()