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
126 lines
4.5 KiB
8 months ago
|
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()
|