Curso-lenguaje-python/python-ofensivo/10_calculadora/calculadora.py

185 lines
3.9 KiB
Python

#!/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("<Key>", 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()