Cómo crear una calculadora - Parte lógica - Tkinter desde cero - Capítulo 13


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

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.

Código

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.

Código

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.

Código

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.

Código

command=suma

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

Terminemos ya con la calculadora añadiendo algo que puede que hayas notado que le falta. Se trata de un botón de "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.

Resultado

Calculadora Tkinter Python


Suscríbete a mi canal de YouTube para apoyarme

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.


Comentarios

Si te quedan dudas sobre el temario, sobre Python, 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.