Está en la página 1de 26

Codigo para hacer una calculadora en python

Crear una calculadora en Python en 3 sencillos pasos no es tan difícil si se usa un


código limpio, la mejor forma es hacerla paso a paso para evitar los errores de sintaxis
al ejecutar el programa, el código que les compartiré es el más limpio que hay,
con limpio me refiero a que no incluye cosas extra como librerías avanzadas que les
impediría entender que hace cada parte del código, además si al final quieren incluirle
algo para personalizarlo pueden hacerlo a gusto posteriormente, este código es la base
para cualquier calculadora en Python y funciona para cualquier IDE como Pycharm,
Sublimetext y Visual studio code, entre otros.

Importando la librería Tkinter


Para hacer la interfaz gráfica necesaria para la ventana, colocar los botones y el campo
donde visualizaremos los números vamos a usar Tkinter, ya viene incluida en la
instalación de Python(no importa el IDE), para importarla solo necesitamos colocar en
un documento nuevo lo siguiente:

from tkinter import*

Tras esto ya podemos crear todo el código pero entendamos primero los pasos que
haremos.

1 Crearemos una ventana.


2 Haremos todos los botones que contendrá la ventana incluyendo números, botones
con operadores como el de suma, resta, división, multiplicación y el botón de igual para
hacer el cálculo, en cada botón pasaremos un comando para identificarlo.
3 Procesaremos los datos porque una cosa es hacer los botones y otra cosa es
darles funcionamiento, este tercer paso no es tan difícil como parece se hace con
una sola función llamada eval, ¡empecemos!.

Creando la ventana en Tkinter

La ventana se hace con la función TK() le tenemos que dar un nombre a la variable de
esta ventana y ningún nombre más clásico que ventana, pueden ponerle el que gusten
posteriormente pero por ahora recomiendo no cambiar cosas porque luego puede
no funcionarles si olvidan cambiarlo en todos los sitios que aparece.

if name == " main ":

ventana = Tk()

ventana.configure(background="light green")

ventana.title("Codigazo calculator V1.0")

ventana.geometry("265x125")

ventana.mainloop()

Como pueden ver además de crear la ventana con la función tk incluí varios parámetros
extra llamados métodos, el primero es configure donde le asigné un color al
background esto es al fondo de la ventana, pueden usar otros colores como gray,
yellow, blue, red, green y asi sucesivamente, con el método title como su nombre lo
indica coloqué entre comillas el nombre que tendrá la ventana, este es el nombre
visible de nuestro programa, el nombre también pueden cambiarlo, y es que al final la
parte grafica de los programas o aplicaciones es muy importante para que el
usuario se sienta cómodo o perciba que está haciendo uso de una aplicación seria, el
método geometry básicamente sirve para dar el tamaño en medida de pixeles a la
ventana, tanto su altura como su anchura, también pueden jugar con estos
parámetros, al final le aplique a la ventana una llamada a la funcion mainloop(), sin
esto el programa si se ejecutará pero se cerraría de inmediato tan pronto como lee el
código, como su nombre lo indica mainloop sirve para crear un loop es decir un bucle
que se repite una y otra vez pasando por este código así evitaremos que nuestro
programa se cierre hasta que cerremos la ventana manualmente.

Agreguemos tres sencillas líneas de código mas que servirán para crear un campo de
tipo Entry, estos son campos donde se puede ver y escribir texto.

calculo = StringVar()

datos = Entry(ventana, textvariable=calculo)

datos.grid(columnspan=10, ipadx=50)

En el código anterior la primer línea crea una variable llamada calculo, la segunda línea
crea el campo llamado datos que es donde veremos los números y las operaciones y la
tercer línea le da una ubicación con su anchura definida usando el método grid,¿fácil
verdad?.

Creando los botones de la calculadora

Se crea un controlador de tipo button yo le llamare al primero boton1 el primer valor a


pasar es el nombre de la ventana a la que pertenecerá, ¿recuerdan que le habíamos
puesto el nombre ventana?, bien pues ese usaremos, el segundo parámetro llamado
text este incluirá el texto que veremos en el botón como estamos haciendo el botón
con el numero 1 ese es el texto que incluimos, cuando hagamos el de igual incluiremos
el símbolo = y así con cada uno, el tercer parámetro llamado fg que significa
foreground sirve para colocar el color de frente en otras palabras el del texto, en
este caso será negro y bg significa background para el color de fondo que será blanco,
el siguiente parámetro es importante en el command utilizaremos lambda que es un
tipo de expresión que nos permite pasar distintos parámetros a una sola
función, a la función le llamaré digito e incluirá el numero 1, para finalizar height es la
altura y width es la anchura en pixeles.

boton1 = Button(ventana, text=' 1 ', fg='black', bg='white',

command=lambda: digito(1), height=1, width=7)


Espero que no intentaran todavía ejecutar lo anterior porque de ser así aunque si
verán la ventana les lanzara errores por cuanto no hemos creado todavía la función
digito(), pero si ya entendieron el código anterior solo queda crear los otros
botones repitiendo el código anterior y se ve de la siguiente forma (todos los botones
juntos).

boton1 = Button(ventana, text=' 1 ', fg='black', bg='white',

command=lambda: digito(1), height=2, width=5)

boton1.grid(row=2, column=0)

boton2 = Button(ventana, text=' 2 ', fg='black', bg='white',

command=lambda: digito(2), height=2, width=5)

boton2.grid(row=2, column=1)

boton3 = Button(ventana, text=' 3 ', fg='black', bg='white',

command=lambda: digito(3), height=2, width=5)

boton3.grid(row=2, column=2)

boton4 = Button(ventana, text=' 4 ', fg='black', bg='white',

command=lambda: digito(4), height=2, width=5)

boton4.grid(row=3, column=0)

boton5 = Button(ventana, text=' 5 ', fg='black', bg='white',

command=lambda: digito(5), height=2, width=5)

boton5.grid(row=3, column=1)

boton6 = Button(ventana, text=' 6 ', fg='black', bg='white',

command=lambda: digito(6), height=2, width=5)

boton6.grid(row=3, column=2)

boton7 = Button(ventana, text=' 7 ', fg='black', bg='white',

command=lambda: digito(7), height=2, width=5)

boton7.grid(row=4, column=0)
boton8 = Button(ventana, text=' 8 ', fg='black', bg='white',

command=lambda: digito(8), height=2, width=5)

boton8.grid(row=4, column=1)

boton9 = Button(ventana, text=' 9 ', fg='black', bg='white',

command=lambda: digito(9), height=2, width=5)

boton9.grid(row=4, column=2)

boton0 = Button(ventana, text=' 0 ', fg='black', bg='white',

command=lambda: digito(0), height=2, width=5)

boton0.grid(row=5, column=0)

suma = Button(ventana, text=' + ', fg='black', bg='white',

command=lambda: digito("+"), height=2, width=5)

suma.grid(row=2, column=3)

resta = Button(ventana, text=' - ', fg='black', bg='white',

command=lambda: digito("-"), height=2, width=5)

resta.grid(row=3, column=3)

multiplica = Button(ventana, text=' * ', fg='black', bg='white',

command=lambda: digito("*"), height=2, width=5)

multiplica.grid(row=4, column=3)

divide = Button(ventana, text=' / ', fg='black', bg='white',

command=lambda: digito("/"), height=2, width=5)

divide.grid(row=5, column=3)

resultado = Button(ventana, text=' = ', fg='black', bg='white',

command=igual, height=2, width=5)

resultado.grid(row=5, column=2)
limpiar = Button(ventana, text='Limpiar', fg='black', bg='white',

command=limpiar, height=2, width=5)

limpiar.grid(row=5, column='1')

Funciones para la calculadora

Este es todo el código grafico ahora solo queda crear 3 funciones que atienden al punto
número 3 es decir el de procesamiento de datos, para decirlo de otra forma es el
código que se encarga de hacer las operaciones típicas de una calculadora.

def digito(num):

global boton

boton = boton + str(num)

calculo.set(boton)

def igual():

try:

global boton

total = str(eval(boton))

calculo.set(total)

boton = ""

except:

calculo.set(" error ")

def limpiar():

calculo.set("")

La función digito sirve para guardar toda la expresión matemática por ejemplo
"8+4+5*20/2", digito lo guardará y de inmediato lo mostrara el campo de datos que
habíamos creado haciendo uso del método set en la variable calculo, limpiar hace algo
similar nada más que en lugar de enviar dígitos reemplaza el texto existente por un
valor vacío, y la función igual procesa todo con la función matemática eval() como es
de esperar evaluando la expresión y mostrando el resultado.

Ahora si pueden ejecutarlo y verificar que todo esté en orden, ya tienen su primer
calculadora en Python y a partir de ahí pueden ampliarle funciones o cambiarle el
diseño, que de hecho a mi parecer este diseño no es muy bueno por lo básico que es, a
continuación va el código entero por si confundieron algún paso.

from tkinter import *

boton = ""

def digito(num):

global boton

boton = boton + str(num)

calculo.set(boton)

def igual():

try:

global boton

total = str(eval(boton))

calculo.set(total)

boton = ""

except:

calculo.set(" error ")

def limpiar():

calculo.set("")

if name == " main ":


ventana = Tk()

ventana.configure(background="light blue")

ventana.title("Codigazo Calculator")

ventana.geometry("195x183")

calculo = StringVar()

datos = Entry(ventana, textvariable=calculo)

datos.grid(columnspan=10, ipadx=50)

boton1 = Button(ventana, text=' 1 ', fg='black', bg='white',

command=lambda: digito(1), height=2, width=5)

boton1.grid(row=2, column=0)

boton2 = Button(ventana, text=' 2 ', fg='black', bg='white',

command=lambda: digito(2), height=2, width=5)

boton2.grid(row=2, column=1)

boton3 = Button(ventana, text=' 3 ', fg='black', bg='white',

command=lambda: digito(3), height=2, width=5)

boton3.grid(row=2, column=2)

boton4 = Button(ventana, text=' 4 ', fg='black', bg='white',

command=lambda: digito(4), height=2, width=5)

boton4.grid(row=3, column=0)

boton5 = Button(ventana, text=' 5 ', fg='black', bg='white',


command=lambda: digito(5), height=2, width=5)

boton5.grid(row=3, column=1)

boton6 = Button(ventana, text=' 6 ', fg='black', bg='white',

command=lambda: digito(6), height=2, width=5)

boton6.grid(row=3, column=2)

boton7 = Button(ventana, text=' 7 ', fg='black', bg='white',

command=lambda: digito(7), height=2, width=5)

boton7.grid(row=4, column=0)

boton8 = Button(ventana, text=' 8 ', fg='black', bg='white',

command=lambda: digito(8), height=2, width=5)

boton8.grid(row=4, column=1)

boton9 = Button(ventana, text=' 9 ', fg='black', bg='white',

command=lambda: digito(9), height=2, width=5)

boton9.grid(row=4, column=2)

boton0 = Button(ventana, text=' 0 ', fg='black', bg='white',

command=lambda: digito(0), height=2, width=5)

boton0.grid(row=5, column=0)

suma = Button(ventana, text=' + ', fg='black', bg='white',

command=lambda: digito("+"), height=2, width=5)

suma.grid(row=2, column=3)

resta = Button(ventana, text=' - ', fg='black', bg='white',

command=lambda: digito("-"), height=2, width=5)

resta.grid(row=3, column=3)

multiplica = Button(ventana, text=' * ', fg='black', bg='white',

command=lambda: digito("*"), height=2, width=5)


multiplica.grid(row=4, column=3)

divide = Button(ventana, text=' / ', fg='black', bg='white',

command=lambda: digito("/"), height=2, width=5)

divide.grid(row=5, column=3)

resultado = Button(ventana, text=' = ', fg='black', bg='white',

command=igual, height=2, width=5)

resultado.grid(row=5, column=2)

limpiar = Button(ventana, text='Limpiar', fg='black', bg='white',

command=limpiar, height=2, width=5)

limpiar.grid(row=5, column='1')

ventana.mainloop()

Capturar numeros desde el teclado

En la programación muy poco está hecho, la mayoría hay que ir haciéndolo, con el
código anterior pueden utilizar la calculadora pero si presionan la tecla enter(intro)
para obtener el resultado no obtendrán esultado, además apenas abren la calculadora
es necesario que den click en el campo input para empezar a escribir los dígitos con el
teclado, porque si intentan digitar sin haber dado click en dicho campo simplemente no
captará los números, esto se debe a que en verdad la ventana entera ha de
capturar los eventos del teclado, con el siguiente código les enseño como capturar
los eventos del teclado para que sea el usuario quien decida como utilizará su
calculadora pues es muy molesto tener una calculadora donde es necesario clickar el
botón "=" en lugar de usar la tecla intro.

Debajo de la función limpiar y no dentro añadimos la siguiente función

def teclado(event):

digito(event.char)
La función la llamaremos teclado y capturará los eventos que se enviaran desde la
llamada, a su vez esta función hace una llamada a la función digito(), y dentro
de esta función enviamos los datos contenidos en event.char, char es el método
que sirve para indicar que lo que queremos enviar es el carácter del objeto event. Muy
bien ahora hagamos la llamada a esta función cada vez que se presione una tecla, esto
con ayuda del método bind contenido en el objeto de nuestra ventana agregando una
línea de código casi al final del código, justo antes de la última línea que dice
ventana.mainloop(), el código es este.

ventana.bind("<Key>",teclado)

Como iba diciendo bind es el objeto al cual le decimos que capture "<Key>" es decir
cualquier key(tecla), y que cuando lo haga añada una llamada a la función que
creamos anteriormente llamada "teclado", con esto ya no es necesario clicar primero
en el campo input antes de digitar los números, pero todavía tenemos que ligar la tecla
enter a la función igual() que es para obtener el resultado y así nuestra tecla enter será
como clicar en "=", como ya la función igual() existe no tenemos que crear más
funciones solo tenemos que detectar cuando se presione la tecla enter y llamar esta
vez a la función teclado, la siguiente línea de código nos permite hacer esto, solo
asegúrese incluirla justo antes de la sentencia anterior , es decir antes de
ventana.bind("<Key>",teclado)

ventana.bind("<Return>", (lambda event: igual()))

Comentarios y preguntas
felipe:

Si quisiera que la calculadora tuviera para colocarle paréntesis para encerrar expresiones y un punto
para señalar que el numero es un float como lo hago?

Codigazo:

Para colocar un punto creamos otro botón definiendo su nombre y en el campo "text" colocamos un
punto, como en el siguiente código:

punto = Button(ventana, text='.', fg='black', bg='white',


command=lambda: digito("."), height=2, width=5)

punto.grid(row=6, column=0)

Ese código podemos colocarlo debajo del botón limpiar pero pese a que nuestra ventana tiene una
altura máxima de 183px es obvio que para poder ver el botón tendríamos que agrandar con el mouse la
ventana de nuestra calculadora y esto es muy feo así que agrandamos su tamaño modificando la
sentencia ventana.geometry("195x183") por ventana.geometry("195x225").

Con el tema de parentesis hacemos lo mismo:

parentesis1 = Button(ventana, text='(', fg='black', bg='white',

command=lambda: digito("("), height=2, width=5)

parentesis1 .grid(row=6, column=1)

parentesis2 = Button(ventana, text=')', fg='black', bg='white',

command=lambda: digito(")"), height=2, width=5)

parentesis2 .grid(row=6, column=2)


Y asi queda nuestro codigazo, cualquier otra duda con mucho gusto.

peter:

hola

Emmanuel
:
Hola a mi me da el error en except eso me señala

Codigazo:

Hola Emmanuel, ¿error en exept?, me imagino que se refiere que le aparece la palabra error al clicar el
igual, de ser así esto se debía que previamente a clicar el botón igual usted intentó presionando enter y
al ver que no salía el resultado dio click en "=", acabo de añadir un código que permite capturar los
números y otros eventos del teclado en nuestra calculadora, lea esa parte final, actualice su código y
verá que ahora todo está bien.

Adri:

Hola, como podría evitar que en la calculadora se pueda dividir entre 0?

Codigazo:

Hola adri, de hecho con el código anterior no se puede dividir entre cero, si lo intenta le lanzará un
error, pero si gusta se puede personalizar este mensaje de error para que nos aparezca un mensaje
como el de la calculadora de Windows que dice "No se puede dividir entre cero".

Para lograr esto tenemos que buscar la expresión "/0" dentro del calculo que ingresa el usuario por
ejemplo "9/0" tiene "/0" así sabremos que se intenta dividir entre cero, para hacer esta comparación de
la cadena con nuestra expresión necesitamos utilizar el módulo re, este suele incluirse de forma
automática, pero si por algún motivo tras utilizar el código que viene a continuación le lanza un error,
coloque en el inicio del código la instrucción "import re", mas como acabo de mencionar no debería de
ser necesario.

Solo necesitamos hacer 1 modificación, busque ya mismo en el código la función "def igual()" una vez
la encuentre modifique el código:
def igual():

try:

global boton

total = str(eval(boton))

calculo.set(total)

boton = ""

Cambiándolo por el siguiente:

def igual():

try:

global boton

cero = re.search("/0", boton, )

if cero:

calculo.set(" No se puede dividir entre cero ")

else:

total = str(eval(boton))

calculo.set(total)

boton = ""

eliana:

Hola como hago para que la calculadora pueda manejar decimales?

Codigazo:

Hola Eliana, en verdad la calculadora ya puede utilizar decimales, pruebe con el teclado numérico y
comprobará que puede por ejemplo hacer esto 8.5+1.2 le dará un resultado en decimales, esta es una
de las ventajas de Python que no tenemos que cambiar el tipo de datos de las variables, sino que esto
lo hace de forma automática el intérprete.

Si se refiere a que desea ver un botón de punto en la calculadora entonces con 3 sencillas líneas puede
crear este botón con el siguiente código

punto = Button(ventana, text=' . ', fg='black', bg='white',

command=lambda: digito("."), height=2, width=5)

punto.grid(row=6, column=0)
El problema es que el tamaño de la ventana hace que tengamos que alargar el borde inferior de la
calculadora con el mouse para poder ver el botón de punto, así es que para cambiar el tamaño de forma
permanente nos vamos arriba donde dice

ventana.geometry("195x183")

y lo cambiamos por

ventana.geometry("195x224")

Ya está todo hecho y se ve de la siguiente forma

Aunque visualmente no se ve muy bien ese espacio vacío, ¿verdad?


mi propuesta es que al igual como se hace en muchas calculadoras físicas hagamos también en esta
calculadora virtual, alarguemos el botón de ”=” , algunos alargan el número 0, entonces primero
cambiemos la localización del botón "." donde está el igual y bajemos la localización del botón igual,
para esto no es necesario cambiar de posición del código, es necesario editar la posición de los botones
buscando la línea

punto.grid(row=6, column=0)

Cambiarla por
punto.grid(row=5, column=2)

Así también buscar la sentencia

resultado.grid(row=6, column=0)

Para cambiarla por

resultado.grid(column=0, columnspan=4, ipadx=74)

katherine:

hola,como deja en logaritmos naturles y dejan sus todos resultados en notaciones cientificas.

Codigazo:

Hola katherine!, a la verdad me cuesta entender lo que escribió, ¿desea que la calculadora sea capaz de
calcular los algoritmos naturales de algún numero?.

De ser así entonces, es sencillo calcular los logaritmos con ayuda de la función log contenida dentro de
la librería math empecemos importando esta librería agregando arriba (apenas empieza el código) esta
linea.

import math
Agregamos también una nueva función antes de la función igual con el siguiente código

def logaritmo():

try:

global boton

total = str(math.log(eval(boton)))

calculo.set(total)

boton = ""

except:

calculo.set(" error ")

Ahora solo queda cambiar alguna que otra linea, busque y reemplace en el código original, la linea:

punto.grid(row=6, column=0)

Reemplace por:

punto.grid(row=5, column=2)

Busque

resultado.grid(row=6, column=0)

Reemplace por

resultado.grid(column=0, columnspan=4, ipadx=74)


Tambien

ventana.geometry("195x183")

y reemplaza con

ventana.geometry("195x224")

Mauro:

seguramente que para realizar eso tengo que almacenar el resultado obtenido en una variable pero una
vez que lo tengo almacenado no se como utilizarlo para seguir realizando calculos

Mauro:

hola como puedo agregarle el boton c de una calculadora normal es el que resetea la pantalla porque la
tecla limpiar me la resetea solo después de apretar el igual y otra cosita se podrá de alguna manera
almacenar el valor en pantalla para después con el realizar otra operación por ejemplo de una
operación obtuve el resultado 5 si ahora le quiero restar 3 quisiera que con solo apretar resta 3 me lo
reste. gracias

Codigazo:

hola Mauro, Si gusta le cambia la palabra Limpiar por C, en cuanto al funcionamiento para que pueda
borrar tanto si se ha presionado el igual o si no se ha presionado lo que tenemos que hacer es añadir 2
líneas a la función limpiar(), así es que busque esta función

def limpiar():

calculo.set("")

Y cambiela por

def limpiar():

global boton

calculo.set("")

boton = ''

Pasando a la parte de almacenar el resultado del cálculo, efectivamente su modo de pensar que el
cálculo ha de almacenarse en una variable es correcto, pero de hecho ya se almacena en una, esta es la
variable total, para no complicar la explicación observe que en la función igual() al final después de
calcularse y mostrarse en el campo input la operación que se ha añadido tras presionar cada número en
la variable botón se borra al utilizar esta sentencia

boton = ''

Si elimina esa sentencia podrá ver que ya puede sumar pero cada vez que agrega un operador como
"+,-,*..." volverá a ver toda la operación, así es que para evitar esto haga lo siguiente

boton = total

Con eso queda tal y como lo desea, disculpe por haber tardado un poco más de lo habitual en
responderle

felipe:

hola, como podria hacer que los resultadoslos de en notación cientifica?

Codigazo:

Hola felipe!, aunque tal emprendimiento parece muy difícil al utilizar un par de palabras reservadas
para formato se nos hace muy sencillo

Lo primero que ha de hacer es agrandar el tamaño de la ventana como en la respuesta que le di a


Eliana, luego de eso tendrá que crear un botón puede ser con este código

notacion = Button(ventana, text=' NC ', fg='black', bg='white',

command=notacionc, height=2, width=5)

notacion.grid(row=6, column=0)

Y para finalizar solo ha de crear la funcion llamada "notacionc"

def notacionc():

global boton

s='{:.2e}'.format(int(boton)).replace(".00e+", "*10^")

calculo.set(str(s))

boton = ""
Yo la he añadido justo debajo de la función limpiar compruebe por usted mismo que todos los
resultados quedan en notación científica al presionar dicho botón, del tipo "500 000 000 000 000"
quedará "5*10^14", cualquier otra pregunta ¡quedo atento!.

Alvaro:

¡Hola Codigazo!
Muchas gracias por estas instrucciones. La calculadora me funcionó muy bien, y disfruté el
procedimiento. Le añadí un par de mensajes que a mi criterio, todas las calculadoras deberían tener ya
que son instrumentos utilizados por mucha gente.
En la tecla que me sobró, junto al paréntesis de cierre ´)´ le escribí la palabra ¡Hola!.
Le añadí otra fila al final y en toda la fila le escribí el mensaje ¡Éxitos siempre!
Me gustó como se ve. .. Muchas gracias por su esfuerzo e interés de enseñar.

Yo:

no me deja hacerlo en python 3.8 ¿esto es 2015?

Codigazo:

Hola Alvaro, muchas gracias por sacar el tiempo para comentar, sus modificaciones me parecen muy
interesantes, personalizando pequeños aspectos del código anterior se aprende más tal y como usted lo
hizo.

Codigazo:

Hola Yo, de hecho yo utilizo la versión 2.8 del 2020, el error no tiene relación con la versión, tiene que
ver con otros aspectos, asegúrese de haber copiado bien el código básico y que por lo menos ese pueda
ejecutarse, también verifique tener bien configurado su entorno de desarrollo, si no se ejecuta entonces
le lanzará algún error, de ser así comparta cual es el error para poder analizarlo.

Ferney:

Hola , buenas tardes ; tengo una duda respecto a si se puede cambiar el tamaño del cuadro de texto es
decir en donde colocamos los números?agradezco su respuesta

Codigazo:

Hola Ferney, si claro, para cambiarle el tamaño tiene que cambiar el tamaño de el control Entry que se
llama datos entonces puede modificar su valor "ipadx" para cambiar su anchura o implementar el valor
"ipady" para cambiar su altura, busque la siguiente linea "datos.grid(columnspan=10, ipadx=50)" para
añadir ipady cámbiela por "datos.grid(columnspan=10, ipadx=50, ipady=10)", cambie los valores para
variar sus tamaño.

Sara:

Hola!! no se si ya lo explicaste, no lo encontré. como programo la tecla de delete para eliminar desde
el teclado al igual que como hicimos con la de enter?
gracias!
Jesus:

hola codigazo tengo un problema ya que al añadir la opcion de manejo por teclado en boton de borrar
en el teclado me arroja un boton de asteriscos que no se pueden eliminar

Dani
:
Hola buenas codigazo muchas gracias por ayudarme con phyton estoy aprendiendo y me ayudaste
bastante en mis dudas gracias!!!!

Codigazo:

Hola Sara, si lo hicimos pero no lo explique por separado, justo antes de donde explico como detectar
la tecla enter explico como "capturar números desde el teclado", con esa misma sentencia que es esta:

ventana.bind("<Key>", teclado)

con la sentencia anterior se detecta también la pulsación de "Delete" y su uso es limpiar la pantalla tal
y como usted lo desea, si no le esta funcionando solo agregue la sentencia anterior justo antes de la
sentencia para detectar enter.

Codigazo:

Hola Jesus, acabo de probarlo y no me aparece ese error, copie desde su IDE el codigo completo y
pegelo aquí para poder evaluar si tiene algún error en él.

Alan
:
Y si quisiera que la calculadora fuera un poco mas grande que debería de modificar?

Porque si solo cambio el tamaño de ventana siguen estando los valores en la misma posición

Codigazo:

Hola Alan, como usted bien ha dicho no se puede cambiar solo el tamaño de la ventana, este sin duda
hay que cambiarlo, pero luego tendrá que cambiar también el tamaño de cada botón modificando los
siguientes parámetros

Busque en el primer boton donde dice

command=lambda: digito(1), height=2, width=5)

Cambie el height para modificar su altura y el witdh para modificar su anchura yo lo he cambiado por
estos parámetros

command=lambda: digito(2), height=3, width=7)


Tendrá también que modificar la anchura del control de tipo "Entry" que es el que nos sirve para
visualizar las operaciones y el resultado, yo lo he dejado de la siguiente forma

datos.grid(columnspan=10, ipadx=55, ipady=10)

si desea modificar solo la anchura entonces nada más cambie ipadx, si quiere modificar la altura
entonces cambie el valor de piady

Imagino que ya sabe que el tamaño de la ventana se modifica cambiando


"ventana.geometry("235x265")".

Los cambios que hice en el tamaño hicieron que mi calculadora en Python quede como se observa en
la siguiente imagen

paco:

este codigo es excelente!

Yeik:

me parece excelente

El
pepe:
A mi me funciona pero solo me abre la pestaña del codigazo calculator, pero todo verde. Q deberia
hacer

Codigazo:
El pepe, eso se debe a algún error al crear el programa y mostrar los controles, si solo ha colocado el
código de crear la ventana entonces continúe con los otros puntos y añada los botones, la
recomendación es que busque en la parte donde coloco el código entero, lo copie y lo pegue en su
IDE, el problema se le deberá de haber solucionado, si aun así persiste hágamelo saber.

royver:

amigo al iniciar el programa desde el terminal me aparece este error, alguna idea de que puede ser?

este es el error:
python: can't open file 'proyecto': [Errno 2] No such file or directory

Codigazo:

hola Royver, el error "python: can't open file 'proyecto': [Errno 2] No such file or directory" se debe a
que el archivo no se encuentra en el directorio que usted le ha indicado, ha de indicarle la ruta
completa donde se encuentra su archivo como en el siguiente ejemplo "python
C:\usuario\Python\Projecto\archivo.py", dependiendo el IDE de Python que esté utilizando este puede
haber guardado el archivo en una u otra zona.

Mauro:

hola como puedo hacer para que la calculadora solo me coloque un punto por ejemplo al presionar
0. ...... me de un error pero al realizar una operacion como 0.25 + 0.34 etc si me deje colocar los puntos
que quiero?

Codigazo:

Hola Mauro, haremos lo mismo que hace la calculadora de Windows, esto es que tras presionado una
vez el punto no se admiten más puntos, a menos que se este sumando, restando o ingresando otra
cantidad, pero solo se admite un punto por numero. Lo haremos en 2 pasos.

Para esto es necesario contar cada vez que se presiona un punto, la cantidad se guardará en una
variable llamada "punun", si se ha presionado 2 veces no se agrega este ultimo punto, de lo contrario si
es la primer vez si se permite, para permitir puntos en todas las cifras numéricas entonces restaremos
un punto cada vez que se presione algún operador "+-*/".

Paso 1: agregamos "punun = 0" debajo de boton="", en otras palabras "punun = 0" quedará en la línea
3 del código.

Paso 2: modificamos la función dígito para que quede de la siguiente forma.

def digito(num):

global punun

if (str(num) == "."):

punun=punun+1

if (str(num) == "+" or str(num) == "-" or str(num) == "/" or str(num)== "*"):

if punun>0:

punun = punun - 1
if(punun<2):

global boton

boton = boton + str(num)

calculo.set(boton)

Con el codigo anterior ahora solo admite un punto por numero, tal y como usted lo ha pedido.

dax:

buenas, una pregunta ¿los editores de texto tienen diferentes sintáxis? porque he encontrado que al
tratar de escribír éste código en el mío, hay líneas en que túve que hacer una sintáxis diferente para no
tener errores pero claro, hago un par de líneas de código y aparecen nuevos errores por lo que aún no
sé cuando podré finalmente ejecutar el código. ja!

Codigazo:

hola dax, mientras esté utilizando Python 3 no debería de darle ningún error sin importar el IDE que
esté utilizando. Puede también darse el caso de que esté copiando mal el código.

Oliver:

Hola, me da error en ventana = Tk() por favor espero que me lo podáis solucionar lo antes posible,
GRACIAS!!!

Codigazo:

Acabo de verificar el código y está en buen funcionamiento, comparta el código que tiene para
verificar en que parte lo ha copiado mal, verifique tener instalada la librería Tkinter y comparta
también el código de error que le ha aparecido.

Pruebe copiando el código que está encima del subtitulo "Capturar números desde el teclado".

Aldo
Jesús
Hol:a ,si quisiera agregar un boton para potencia y otro para porcentaje que sea funcional como debería
hacerlo??

Codigazo:

Hola Aldo, tal y como usted lo ha solicitado agregaremos un botón para calcular potencias que
funciona igual que el de la calculadora científica de Windows.

Iniciamos añadiendo justo antes de "ventana.mainloop()" este codigo:

potencia = Button(ventana, text='xⁿ', fg='black', bg='white',

command=potencia, height=2, width=5)


potencia.grid(row=6, column='0')

Con esto ya hemos creado el botón y hacemos un llamado a la función "potencia" que todavía no
hemos creado, para terminar con la parte grafica es necesario agrandar hacia abajo la ventana de otra
forma nuestro botón no se apreciaría, para esto cambiamos "ventana.geometry("195x224")" por "
ventana.geometry("195x183")".

Pasamos a crear la función potencia

La declararemos debajo de la función limpiar con el siguiente codigo

def potencia():

global indicador

global base

global boton

base = boton

indicador=1

boton = ""

calculo.set("")

Está función lo que hace es asignar a la variable indicador el valor "1" y nos permitirá que cuando se
presione el botón "=" nuestra función "igual" entienda si queremos calcular o no una potencia para así
realizar el calculo necesario, de otra forma no lo sabría, al mismo tiempo introducimos dentro de la
variable "base", la cifra que fue escrita antes de presionar el botón para las potencias.

Para finalizar modificaremos la función "igual" y nos queda de la siguiente forma

def igual():

global boton

global base

global indicador

# lo que viene es nuevo

if (indicador==1):

resultado = str(pow(eval(base),eval(boton)))

calculo.set(resultado)

total = str(base) + "^" + str(boton) + "=" + str(resultado)


calculo.set(total)

boton = ""

indicador=0

else: # hasta aqui llega lo nuevo

try:

total = str(eval(boton))

calculo.set(total)

boton = ""

except:

calculo.set(" error ")

La función que calcula la potencia se llama "pow()", en el primer parámetro de esta función hemos
incluido la primer cifra que representa la base, en el segundo parámetro hemos incluido la segunda
cifra almacenada en la variable "boton" que representa el exponente, estos parámetros se han incluido
dentro de la función eval() para convertir a numero las cifras almacenadas en las variables "boton" y
"base", de no hacerlo Python lo entendería como texto y no como numero.

También podría gustarte