Creación de una interfaz gráfica de calculadora con Tkinter
Capítulo 13: Cómo crear una calculadora - Parte lógica - Tkinter desde cero
Seguimos con la calculadora. En el capítulo anterior creé la parte gráfica, en este haremos que toda esta estructura funcione con unas sencillas funciones.
Función para recoger lo pulsado por el usuario en la calculadora
La primera función que vamos a añadir es una para recoger los botones que va pulsando el usuario. Nos bastan 3 líneas de código para crearla.
def envia_boton(valor):
pantalla.delete(0, END)
pantalla.insert(0, valor)
Funcionamiento del código
Esta función lleva como parámetro el valor que pulse el usuario (valor
). Una vez introducido este valor, borra de la posición 0 del Entry()
(pantalla
) hasta el fin (constante END
de Tkinter), es decir, borra todo lo que contiene el Entry()
.
Y lo mismo para el insert
, solo que este, inserta en el Entry()
, no elimina. Y lo que inserta es el valor almacenado en el argumento valor
de la función.
Lo sé, mucho texto, pero espero que así te quede claro.
¿Y qué hacemos con esta función?
Solo añade un atributo command
con la llamada a la función y como argumento el valor correspondiente a cada número. Para que no las tengas que escribir todas, te las dejo aquí abajo para que las pegues en tu código.
Por cierto, si no sabes muy bien dónde colocar este código, en el vídeo lo podrás ver.
command=lambda: envia_boton(1)
command=lambda: envia_boton(2)
command=lambda: envia_boton(3)
command=lambda: envia_boton(4)
command=lambda: envia_boton(5)
command=lambda: envia_boton(6)
command=lambda: envia_boton(7)
command=lambda: envia_boton(8)
command=lambda: envia_boton(9)
command=lambda: envia_boton(0)
command=lambda: envia_boton(+)
command=lambda: envia_boton(-)
command=lambda: envia_boton(*)
command=lambda: envia_boton(/)
command=lambda: envia_boton(.)
¿Porqué usar funciones lambda
en la llamada?
Esto es para que no envíe el valor directamente sin pulsar los botones.
Con esta configuración, Los números se añaden de uno en uno y cada vez que pulsamos en un botón, se borra el valor anterior y se sustituye por el nuevo.
Claro, ¿entonces cómo ponemos números de más de un dígito?
Le añadimos un get
para que obtenga el número anterior. Que elimine lo que hay en la pantalla para que no lo obtenga todo repetido e insertamos el número anterior con el nuevo valor. Por cierto, tiene que ser string por el tipo de formulario Entry()
.
def envia_boton(valor):
anterior = pantalla.get()
pantalla.delete(0, END)
pantalla.insert(0, str(anterior) + str(valor))
Funciones para la resta, suma, división y multiplicación
Vamos a crear una función específica para la suma, resta, multiplicación y división.
Lo primero es crear una variable global para poderla alcanzar desde fuera de la función en la que obtenemos lo que hay en la pantalla.
Transformamos el string obtenido desde la pantalla en integer o en float si quieres que la calculadora sea capaz de utilizar decimales, recuerda que aquí estamos trabajando con un string en el Entry()
.
Y finalmente que elimine lo que aparece en pantalla para poder introducir un segundo número a sumar.
Código de la función para sumar
def suma():
global num1
num1 = pantalla.get()
num1 = float(num1)
pantalla.delete(0,END)
Con esto, ya tendremos en la variable num1
almacenado el primer valor.
Al botón de suma, añádele el command
para hacer la llamada a la función suma
.
command=suma
Código de la función igual
Ahora pongamos una función para el botón igual, el cuál va a tener algo más de complicación, pero no mucha.
El igual almacenará el segundo número y borrará lo que hay en pantalla para mostrar la operación en ella.
def igual():
global num2
num2 = pantalla.get()
pantalla.delete(0, END)
pantalla.insert(0, num1 + float(num2))
Añade la llamada en el botón igual como ya sabes, con un command
.
Si paramos un momento, nos daremos cuenta, de que está muy bien, el insert
de la función igual
hace la suma con los dos números correctamente.
¿Qué pasa con el resto de operaciones?
Pues que no están soportadas por nuestra función, así que toca mejorarla.
Hay que hacerle saber de alguna forma cuál es la operación que quiere el usuario.
Esto se consigue poniendo una variable que en el momento de pulsar un símbolo de operación, deje su valor y el programa sepa qué operación debe hacer en cada momento.
Añadimos una variable global a la función suma
y le das el valor que quieras, como por ejemplo suma, adición, el símbolo de la suma, es solo identificativo.
def suma():
global num1
global operacion
num1 = pantalla.get()
num1 = float(num1)
pantalla.delete(0,END)
operacion = "+"
Ahora, crea el resto de operaciones, adaptando el código de la suma a las otras operaciones. Si no sabes como, lo puedes ver en el vídeo.
La función igual quedará así, quitamos el insert
que solo sumaba y en su lugar añadimos estos if
:
def igual():
global num2
num2 = pantalla.get()
pantalla.delete(0, END)
if operacion == "+":
pantalla.insert(0, num1 + float(num2))
if operacion == "-":
pantalla.insert(0, num1 - float(num2))
if operacion == "*":
pantalla.insert(0, num1 * float(num2))
if operacion == "/":
pantalla.insert(0, num1 / float(num2))
Añadir un botón para despejar o borrar la pantalla de la calculadora
Terminemos ya con la calculadora añadiendo algo que puede que hayas notado que le falta. Se trata de un botón "clear", el típico botón para borrar lo que hay en pantalla cuando nos equivocamos o cuando queremos hacer una nueva operación.
boton_despejar = Button(root,text="Despejar",
width=40,
height=3,
bg="deep sky blue",
fg="black",
borderwidth=0,
cursor="hand2",
command=despejar).grid(row=5, column=0, columnspan=4, padx=1, pady=1)
Y añade la función:
def despejar():
pantalla.delete(0, END)
Además como extra, os dejo de ejercicio, que me digáis en los comentarios cómo haríais para mostrar en la pantalla un mensaje de error en caso de que el usuario pulse una tecla equivocada en el momento equivocado. Por ejemplo, el botón igual sin haber pulsado ningún número o cualquier otro fallo del estilo.
Resolveré el ejercicio en el próximo capítulo.
Comentarios
Si te quedan dudas sobre el temario, sobre Tkinter, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.