From bd197dc519222799a5923683ea74c00111e4da96 Mon Sep 17 00:00:00 2001 From: Manuel Vergara Date: Wed, 24 Jan 2024 18:45:39 +0100 Subject: [PATCH] Add calculator project --- python-ofensivo/10_calculadora/calculadora.py | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 python-ofensivo/10_calculadora/calculadora.py diff --git a/python-ofensivo/10_calculadora/calculadora.py b/python-ofensivo/10_calculadora/calculadora.py new file mode 100644 index 0000000..1d4af3f --- /dev/null +++ b/python-ofensivo/10_calculadora/calculadora.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python3 +""" +Calculadora +""" + +import tkinter as tk + + +class Calculadora: + """ + Clase calculadora + """ + + def __init__(self, master): + + self.master = master + self.display = tk.Entry( + master, width=20, font=("Arial", 23), justify="right", + bd=10, insertwidth=1, bg="#6495DE" + ) + self.display.grid(row=0, column=0, columnspan=4) + self.op_verification = False + self.current = '' + self.op = '' + self.total = 0 + + row = 1 + col = 0 + + buttons = [ + "7", "8", "9", "/", + "4", "5", "6", "*", + "1", "2", "3", "-", + "C", "0", ".", "+", + "=" + ] + + for button in buttons: + + self.build_button(button, row, col) + + col += 1 + + if col > 3: + + col = 0 + row += 1 + + if row == 5: + col += 2 + + self.master.bind("", self.key_press) + + def key_press(self, event): + + key = event.char + + if key in "0123456789.+-*/": + + self.click(key) + + elif key == "\r": + + self.calculate() + + elif key == "\x08": + + self.clear_display() + + elif key == "\x1b": + + self.master.quit() + return + + else: + + print(f"\n[+] Tecla presionada: {key}") + print(f"[+] Valor actual: {self.current}") + print(f"[+] Verificación de operador: {self.op_verification}") + print(f"[+] Operador: {self.op}") + print(f"[+] Total: {self.total}") + + def clear_display(self): + + self.display.delete(0, tk.END) + self.op_verification = False + self.current = '' + self.op = '' + self.total = 0 + + def calculate(self): + + if self.current and self.op: + + if self.op == "+": + + self.total += float(self.current) + + elif self.op == "-": + + self.total -= float(self.current) + + elif self.op == "*": + + self.total *= float(self.current) + + elif self.op == "/": + + self.total /= float(self.current) + + self.display.delete(0, "end") + self.display.insert(tk.END, round(self.total, 3)) + + return self.total + + def click(self, key): + + if self.op_verification: + + self.op_verification = False + + self.display.insert(tk.END, key) + + if key in "0123456789" or key == ".": + + self.current += key + + else: + + if self.current: + + if not self.op: + + self.total = float(self.current) + + self.current = '' + + self.op_verification = True + self.op = key + + print(f"\n[+] Tecla presionada: {key}") + print(f"[+] Valor actual: {self.current}") + print(f"[+] Verificación de operador: {self.op_verification}") + print(f"[+] Operador: {self.op}") + print(f"[+] Total: {self.total}") + + def build_button(self, button, row, col): + + if button == "C": + + b = tk.Button( + self.master, text=button, + width=3, + font=("Arial", 23), + command=lambda: self.clear_display() + ) + + elif button == "=": + + b = tk.Button( + self.master, text=button, + width=8, height=2, + font=("Arial", 23), + command=lambda: self.calculate() + ) + + else: + + b = tk.Button( + self.master, text=button, + width=3, + font=("Arial", 23), + command=lambda: self.click(button) + ) + + b.grid(row=row, column=col, columnspan=2 if row == 5 else 1) + + +root = tk.Tk() +root.title("Calculadora") +root.resizable(width=False, height=False) +my_gui = Calculadora(root) + +root.mainloop()