Mundo em Python

Converter moedas da CPLP

from tkinter import *
import requests # Dicionário com nomes e códigos ISO
moedas_cplp1 = {
"Angola - Kwanza (AOA)": "AOA",
"Brasil - Real (BRL)": "BRL",
"Cabo Verde - Escudo (CVE)": "CVE",
"Guiné-Bissau - Franco CFA (XOF)": "XOF",
"Moçambique - Metical (MZN)": "MZN",
"Portugal - Euro (EUR)": "EUR",
"São Tomé e Príncipe - Dobra (STN)": "STN",
"Timor-Leste - Dólar Americano (USD)": "USD",
"Guiné Equatorial - Franco CFA (XAF)": "XAF"
} moedas_cplp2 = moedas_cplp1.copy() # Função para buscar taxas de câmbio atualizadas
def obter_taxas():
try:
url = "https://api.exchangerate-api.com/v4/latest/USD"
resposta = requests.get(url)
data = resposta.json()
if "rates" in data:
return data["rates"]
else:
raise Exception("Erro ao obter dados da API.")
except Exception as e:
resultado_texto.config(text=f"Erro: {e}", fg="red")
return None

root = Tk()
root.geometry("700x600")
root.resizable(0, 0)
root.config(bg="#103030")
root.title("Converter moedas da CPLP") # Título
titulo = Label(text="Converter moedas da CPLP",
font=("Arial", 28, "bold"), bg="#103030", fg="#49e3e3")
titulo.place(relx=0.1, rely=0.05) # Campo de valor
texto_sub1 = Label(text="Valor:",
font=("Arial", 18, "bold"), bg="#103030", fg="#49e3e3")
texto_sub1.place(relx=0.2, rely=0.18) Valor = StringVar()
Valor_entrada = Entry(textvariable=Valor,
font=("Arial", 12, "bold"),
bg="white", fg="blue", justify='center')
Valor_entrada.place(relx=0.45, rely=0.2, relwidth=0.35)
Valor_entrada.focus() # Menu "De:"
texto_sub2 = Label(text="De:",
font=("Arial", 20, "bold"), bg="#103030", fg="#49e3e3")
texto_sub2.place(relx=0.05, rely=0.3) var1 = StringVar()
var1.set(list(moedas_cplp1.keys())[0])
dropdown1 = OptionMenu(root, var1, *moedas_cplp1)
dropdown1.place(relx=0.15, rely=0.31, relwidth=0.8)
dropdown1.config(bg='#09A3BA', fg="#FFFFFF", font=("Arial", 14, "bold"))
dropdown1["menu"].config(bg='#09A3BA', fg="#FFFFFF", font=("Arial", 12, "bold")) # Menu "Para:"
texto_sub3 = Label(text="Para:",
font=("Arial", 20, "bold"), bg="#103030", fg="#49e3e3")
texto_sub3.place(relx=0.05, rely=0.45) var2 = StringVar()
var2.set(list(moedas_cplp2.keys())[1])
dropdown2 = OptionMenu(root, var2, *moedas_cplp2)
dropdown2.place(relx=0.17, rely=0.46, relwidth=0.8)
dropdown2.config(bg='#09A3BA', fg="#FFFFFF", font=("Arial", 14, "bold"))
dropdown2["menu"].config(bg='#09A3BA', fg="#FFFFFF", font=("Arial", 12, "bold")) # Função de limpar
def limpar():
Valor_entrada.delete(0, END)
resultado_texto.config(text="") # Função de conversão
def app():
try:
valor = float(Valor.get())
de = moedas_cplp1[var1.get()]
para = moedas_cplp2[var2.get()] taxas = obter_taxas()
if taxas is None:
return

if de not in taxas or para not in taxas:
resultado_texto.config(text="Moeda não disponível na API.", fg="red")
return

# Converter: USD → De → Para
# taxa_de: quantos USD valem 1 unidade da moeda “de”
taxa_de = 1 / taxas[de]
taxa_para = taxas[para]
convertido = valor * taxa_de * taxa_para resultado_texto.config(
text=f"{valor:.2f} {de} = {convertido:.2f} {para}",
bg="#cfe2f3", fg="black"
)
except ValueError:
resultado_texto.config(text="Por favor, insira um valor numérico válido.", fg="red") # Botões
but1 = Button(text="Calcular", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=app)
but1.place(relx=0.1, rely=0.65, relwidth=0.25, relheight=0.1) but_limpar = Button(text="Limpar", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=limpar)
but_limpar.place(relx=0.4, rely=0.65, relwidth=0.25, relheight=0.1) but_sair = Button(text="Sair", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=root.destroy)
but_sair.place(relx=0.7, rely=0.65, relwidth=0.25, relheight=0.1) resultado_texto = Label(text="", font=("Arial", 12, "bold"), bg="#cfe2f3")
resultado_texto.place(relx=0.05, rely=0.8, relwidth=0.9, relheight=0.15) root.mainloop()
0