Proyecto Python medio: ¿Cómo hacer un exchange con interfaz gráfica?

Hola mundo 👋🏻 mi nombre es Francisco, fcoteroba en Internet y hoy os vuelvo a traer un post en el que vamos a realizar otro proyecto en nuestro querido y amado 💚 lenguaje de programación Python 🐍.

Este proyecto es algo más complejo de los dos anteriores realizados ya en la web.
Si no los has visto ya, te recomiendo verlos antes de proseguir con este: ¿Cómo hacer una calculadora en la consola de comandos? así cómo el proyecto que hicimos para generar códigos QR.

Antes de comenzar, aunque posteriormente te voy a explicar qué es, te recomiendo visitar un post que subí hace más de un mes, en el que explico muchos de los términos informáticos más usados en nuestro día a día. Ya que, en este post, verás palabras que probablemente no te suenen mucho. 🤯 Puedes leer el post aquí.

También quiero recordarte que hace unas semanas subí un vídeo a mi canal de YouTube, muy interesante, enfocado en la domótica del hogar. Concretamente, conectamos, configuramos e instalamos una bombilla inteligente 💡 con la que puedes cambiar el color de la misma, apagarla, encenderla y muchísimo más simplemente haciendo uso de tu teléfono móvil y/o asistentes de voz cómo Google, Alexa, etcétera. 👇🏻

Ahora sí que sí, comencemos 👇🏻

¿Qué es un exchange?

Bueno, imagino que antes de programar una cosa, querrás saber qué es dicha cosa. Para ello, te comento lo que dice Wikipedia sobre ello:

Los exchanges, también conocidos como plataformas o mercados de intercambio, son plataformas digitales que permiten intercambiarmonedas digitales por dinero fiat y/u otras criptomonedas o mercancías.

Es una explicación rara a la par de explícita única y exclusivamente enfocada a las criptomonedas.

Pero, en realidad, un exchange se define cómo un sitio, web o (en nuestro caso) programa para introducir un valor en una determinada moneda o criptomoneda.

Y eso es lo que vamos a hacer nosotros hoy, vamos a crear una interfaz gráfica, o GUI por sus siglas en inglés en el cual, el usuario insertará un valor en una determinada moneda y el programa mostrará su valor actual a tiempo real.

ANTES DE COMENZAR NECESITAS SABER QUE:

Una API (palabra que verás dentro de unos instantes) es (según la definición de la web de Red Hat) un conjunto de definiciones y protocolos que se utilizan para desarrollar e integrar el software de las aplicaciones. API significa interfaz de programación de aplicaciones.

En resumen, una API suele ser un archivo de un programa independiente, programado única y exclusivamente para ser integrado en otras aplicaciones.

Oye, ¿cómo haremos para que se muestre el valor actual, si esto es un mercado que varía a cada segundo?

Voy a proceder a explicarte todo, paso a paso, tal y cómo hacemos siempre aquí. Pero antes, te voy a enseñar un pequeño GIF de lo que vas a aprender a programar leyendo este simple post! 😁

Ahora sí que sí, aquí llega el primer paso 1️⃣.

Debemos registrarnos en ExchanGerate-API, que es una API libre, abierta y gratuita para realizar conversiones entre monedas de las más variopintas.

El registro es sencillo, simplemente deberemos escribir el correo electrónico al que queramos que llegue la clave gratuita y darle al botón.

Una vez que nos registremos, en nuestro dashboard aparecerá un número muy largo. Dicho número es la clave del API que posteriormente vamos a usar en Python 🐍.

Cuando tengamos dicho código. Vamos a empezar por abrir nuestro IDE favorito. Que en mi caso es VSCode y empezaremos a importar los paquetes que vamos a necesitar en este proyecto. 📦

Aunque lo digo siempre que hago un post sobre Python, recuerdo que en este lenguaje de programación no es necesario precisar de qué tipo será la variable (Char, float, entero,…), a diferencia de otros muchos lenguajes de programación ya que, Python 🐍, entenderá automáticamente el tipo de variable según lo que guardemos en él.

Para este proyecto vamos a importar tkinter de las siguientes formas from tkinter import * y from tkinter import ttk. Estos dos, serán obviamente, para realizar la interfaz gráfica del programa.
Por último, debemos importar también el paquete de requests, que trabaja con páginas webs para decodificar su JSON, extraer información y muchísimo más. El código es import requests.

MUCHO OJO 👀, probablemente os dé fallo con el paquete requests, y esto es porque hay que instalarlo primeramente en la línea de comandos usando el instalador pip. pip install requests

Recordatorio 🧠
Los comentarios en Python se escriben poniendo al comienzo de la línea el símbolo #
Las funciones en la programación. Las funciones, de manera resumida, es un trozo de código que, aunque esté escrita, nunca se accionará hasta que sea invocada. 🧙🏻‍♂️

TKinter 🎨
Tenemos que crear una ventana raíz estableciendo un nombre antes de Tk().
Posteriormente le damos el tamaño de la ventana con minsize(valorx, valory).
Establecemos un título para la ventana con title(“Nombre”)
Y para que ningún usuario pueda ampliar o reducir el tamaño de la ventana, estableceremos a 0 los dos parámetros de resizable(x,y).

Añadiendo todo esto, nuestro programa comienza así:

from tkinter import *
from tkinter import ttk
import requests

#Definición ventana
ventana = Tk() 
ventana.minsize(500, 500)
ventana.title("Exchange realizado en Python | fcoterroba.com")
ventana.resizable(0,0)

Vamos a hacer ahora lo tocho, todo lo que aparecerá en nuestra ventana principal.

1️⃣ Primeramente, vamos a escribir un Label a modo de título del programa, dándole su respectiva configuración de diseño y distribución.

titulo_label = Label(ventana, text="¡Exchange de todas las monedas!")
titulo_label.config(
        fg="white",
        bg="black",
        font=("Arial", 30),
        padx=210,
        pady=20
    )
titulo_label.grid(row=0, column=0)

2️⃣ Lo segundo, establecer la entrada de texto, aunque sea un número, Tkinter no hace distinción de ello, por lo que seremos nosotros quienes daremos una alerta si no es un número.
La entrada de texto se almacenará en una variable que debemos declarar previamente. Yo lo he hecho justo en la línea de debajo de ventana.resizable

numero_label = Label(ventana, text="Dime el número y la moneda correspondiente")
numero_entry = Entry(ventana, textvariable=numero_data)
numero_label.grid(row=1, column=0, padx=5, pady=5)
numero_entry.grid(row=2, column=0, padx=5, pady=5)

3️⃣ La tercera parte es crear los Combobox. Estos elementos son como unas listas desplegables vistos en el desarrollo web u otros.
Para crearlas en Python debes darle un nombre seguido de ttk.Combobox().
Luego, has de bloquear que el usuario pueda escribir encima de la lista con ttk.Combobox(state=”readonly”)
Por último, debes escribir todos los valores que quieres que aparezcan en dicho Combobox. En este caso, serán todas las monedas disponibles en la API.
Esto hay que repetirlo dos veces, primero para la moneda de tu dinero y luego la moneda a la que quieras convertirla.

combo = ttk.Combobox()
combo = ttk.Combobox(state="readonly")
combo["values"] = ["USD", 'AED', 'ARS', 'AUD', 'BGN', 'BRL', 'BSD', 'CAD', 'CHF', 'CLP', 'CNY', 'COP', 'CZK', 'DKK', 'DOP', 'EGP', 'EUR', 'FJD', 'GBP', 'GTQ', 'HKD', 'HRK', 'HUF', 'IDR', 'ILS', 'INR', 'ISK', 'JPY', 'KRW', 'KZT', 'MVR', 'MXN', 'MYR', 'NOK', 'NZD', 'PAB', 'PEN', 'PHP', 'PKR', 'PLN', 'PYG', 'RON', 'RUB', 'SAR', 'SEK', 'SGD', 'THB' 'TRY', 'TWD', 'UAH', 'UYU', 'ZAR']
combo.grid(row=3, column=0, padx=5, pady=5)
second_moneda = Label(ventana, text="A qué moneda lo quieres convertir?")
second_moneda.grid(row=4, column=0, padx=5, pady=5)
combo2 = ttk.Combobox()
combo2 = ttk.Combobox(state="readonly")
combo2["values"] = ["USD", 'AED', 'ARS', 'AUD', 'BGN', 'BRL', 'BSD', 'CAD', 'CHF', 'CLP', 'CNY', 'COP', 'CZK', 'DKK', 'DOP', 'EGP', 'EUR', 'FJD', 'GBP', 'GTQ', 'HKD', 'HRK', 'HUF', 'IDR', 'ILS', 'INR', 'ISK', 'JPY', 'KRW', 'KZT', 'MVR', 'MXN', 'MYR', 'NOK', 'NZD', 'PAB', 'PEN', 'PHP', 'PKR', 'PLN', 'PYG', 'RON', 'RUB', 'SAR', 'SEK', 'SGD', 'THB' 'TRY', 'TWD', 'UAH', 'UYU', 'ZAR']
combo2.grid(row=5, column=0, padx=5, pady=5)

4️⃣ Seguimos con el cuarto paso, que es realizar el botón con el comando de una función que haremos en el siguiente paso. Función que realizará toda la lógica de la conversión y mostrará el resultado.
También, que no se nos olvide ❗ nuestro preciado mainloop. Para que el programa aparezca visualmente.

boton = Button(ventana, text="Convertir", command=conversion)
boton.grid(row=6, column=0)
ventana.mainloop()

5️⃣ En nuestro quinto paso vamos a crear una función con el nombre que le hemos dado a la propiedad command de nuestro botón. def conversion():
Dentro de dicha función, vamos a hacer un try/except principalmente para cuando el usuario inserte algo distinto de números.
TRY
Vamos a crear una variable para obtener la URL de la API añadiendole al final la moneda número 1 con combo.get().
A continuación, creamos una variable response para que obtenga los requests de la url con requests.get(url).
Después, creamos otra variable data para almacenar el json de response.

Y ahora sí, empezamos con las mates! 🔣
Hemos de pasar el número que tenemos a float, creando una nueva variable.
Para finalizar debemos crear una nueva variable resultado multiplicando dicho número float por la moneda existente en el archivo JSON.

Dicho esto, solo nos faltaría establecer un diseño y voilá.

EXCEPT
Simplemente vamos a copiar el diseño hecho para el resultado anterior, poniendo un texto sobre la errata y hacerlo algo más llamativo.

def conversion():
    try:
        url = 'https://v6.exchangerate-api.com/v6/TU-API-KEY/latest/'+combo.get()
        response = requests.get(url)
        data = response.json()
        numero1 = float(numero_entry.get())
        resultado = round((numero1 * data['conversion_rates'][combo2.get()]), 2)
        espacio = Label(ventana, text="")
        espacio.grid(row=7, column=0)
        resultado_label = Label(ventana, text=resultado)
        resultado_label.grid(row=8, column=0)
        resultado_label.config(
            fg="black",
            bg="white",
            font=("Arial", 20),
            padx=400,
            pady=20
        )
    except:
        espacio = Label(ventana, text="")
        espacio.grid(row=7, column=0)
        resultado_label = Label(ventana, text="Hay algo incorrecto. Recuerda que solo puedes escribir NÚMEROS")
        resultado_label.grid(row=8, column=0)
        resultado_label.config(
            fg="red",
            bg="black",
            font=("Arial", 20),
            padx=100,
            pady=20
        )

Si no nos hemos saltado ningún paso, nuestro proyecto debería quedar algo más o menos así:

Y esto ha sido todo por hoy chic@s, espero que os haya gustado este post tanto cómo me ha gustado a mí hacerlo, programar el proyecto y pelearme con la API! Al fin y al cabo, esto es lo bonito de programar, ¿no creéis? 🤓

Nos vemos muy pronto por aquí y ya sabéis que podéis seguirme en TwitterFacebookInstagram y LinkedIn. 🤟🏻

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *