Bienvenidos una semana más a vuestro blog sobre programación en Python, en una ocasión en las que nos disponemos a crear una aplicación con interfaz gráfica (usando ‘Tkinter‘) que calcule el cambio actual entre distintas divisas, utilizando los datos actualizados que nos proporciona ‘Yahoo Finance‘.
COMO FUNCIONA.
El manejo de nuestra aplicación es bien sencillo: El usuario elige las dos divisas de una lista desplegable y luego ingresa la cantidad que desea convertir. Al hacer clic en el botón «CALCULATE«, el programa solicita la tasa de cambio actualizada a través de la biblioteca ‘yfinance‘. Así, una vez obtenida la tasa de cambio, se realiza el cálculo y se muestra el monto convertido en la etiqueta central.
Para construir nuestra aplicación, y dado que necesitaremos descargarnos datos actualizados con ‘yfinance‘, deberemos proceder, antes de nada, a instalar esa librería en nuestro sistema:
Una vez que tengamos ‘yfinance‘ descargado, podremos empezar a escribir nuestra aplicación. Para lo que empezaremos importando las librerías y módulos que vayamos a utilizar:
En esta ocasión, usaremos ‘Tkinter‘ para confeccionar la interfaz, ‘yfinance‘ para obtener los datos de cambio entre divisas actualizados, ‘os‘ para mostrar el directorio de ejecución de la aplicación y ‘threading‘ para evitar bloqueos en el programa, cuando este hace la petición a ‘Yahoo Finance‘.
CREANDO LA INTERFAZ.
El primer paso en la elaboración de nuestra aplicación será el consistente en definir algunas variables iniciales, así como la creación de la ventana y elementos gráficos de nuestra aplicación. Para ello crearemos la clase de nuestra aplicación, en cuyo constructor empezaremos definiendo algunas características tales como el nombre de la ventana, sus dimensiones y la variable «currencies«, un diccionario en el que definiremos el nombre y ticker de las distintas divisas entre las que se va a poder efectuar los cálculos:
Tras ello, incluiremos un espacio en la parte superior de la ventana, en la que se mostrará la dirección del directorio en el que se está ejecutando nuestra aplicación. Dicho directorio lo obtendremos con el modulo ‘os‘ y el método ‘.get()‘:
Tras ello, crearemos las dos listas desplegables en las que se van a mostrar las divisas que definimos en la variable ‘currencies‘:
Pasemos ahora a crear tanto el ‘entry‘ para la cantidad a computar (así como a su variable asociada ‘self.amount‘) como la etiqueta en la que se mostrará el resultado final:
Finalmente (en lo que a la elaboración de la interfaz se refiere) incluiremos, en la parte inferior, el conjunto de botones que vamos a usar para interactuar con el programa, para finalizar haciendo la llamada a su ejecución:
Con ello tendríamos completada la parte puramente gráfica de nuestra aplicación. En efecto si ejecutamos lo hecho obtendremos el siguiente resultado:
OUTPUT:
No obstante, nuestra aplicación aún no hace nada (salvo mostrar en los desplegables, las divisas entre las que podemos elegir). Para hacer que podamos obtener la información deseada, tendremos que crear una serie de funciones que se ocupen de la lógica del programa.
PROGRAMANDO LÓGICA.
Puesto que el resultado que queremos obtener depende de la cantidad que ingresemos a través de los botones numéricos, lo lógico será empezar implementando una función que permita construir dicha cantidad y mostrarla en el ‘entry‘. A dicha función la llamaremos ‘btnClick()‘:
Como se ve, se trata de una función bien sencilla que toma el valor (‘num‘) establecido mediante una función lambda, en la variable ‘command‘ del botón correspondiente, y lo agrega a la variable «amount» ocupándose a la vez, de no admitir más que una coma en el entry.
Como es natural, junto a una función que escriba un número en pantalla, implementaremos otra que se encargue de borrarlo. A esta última la llamaremos ‘reset_display()‘ y ejecución vincularemos con el botón ‘RESET‘:
Con esto ya tendríamos las funciones encargadas de introducir el input en nuestra aplicación. A partir de aquí usaremos dos funciones: Una que se encargue de crear el ticker cuyos datos de cierre vamos a pedir a la API de Yahoo Finance y otra que multiplique el valor introducido en el entry por el valor de cambio recibido la mencionada API. La primera de ellas, se llamará ‘create_ticker()‘ y devolverá la concatenación de los valores asociados a las claves seleccionadas en las listas desplegables más el string ‘=X‘:
La segunda de ellas es la que hemos llamado ‘calculate()‘ y, después de llamar a la anterior, usa ‘yfinance‘ para descargar el último dato disponible y multiplicarlo por el monto introducido para obtener el resultado final que se mostrará en la etiqueta central:
Una sentencia ‘try‘/’except‘ evitará que el programa falle, en caso de que se produzca algún problema imprevisto o una omisión por parte del usuario a la hora de introducir los datos. Mostrando la correspondiente ventana de error:
Finalmente, para evitar que al realizar la petición, la ventana pueda quedarse congelada o bloqueada, usaremos una tercera función que se encargue de ejecutar esta última de manera concurrente. A esta función la hemos llamado ‘init_task()‘ y es la que finalmente vincularemos con el botón ‘CALCULATE‘:
De este modo los valores ‘command‘ para todos los botones, quedaría como sigue:
OUTPUT:
Y con ello ya tendríamos creada nuestra aplicación para conversión de montos de dinero en diferentes divisas. A partir de este punto, podéis continuar desarrollando la aplicación, añadiendo opciones, funcionalidades o introduciendo más divisas a las listas desplegables.
En el siguiente enlace podéis acceder al código completo del script, para que podáis probarlo por vosotros mismos:
https://github.com/antonioam82/Calcu/blob/master/CURRENCY_CALC.py
Saludos.