from tkinter import *
from tkinter import scrolledtext
cidades = {
"Lisboa": 1800,
"Porto": 1400,
"Coimbra": 950,
"Braga": 850,
"Faro": 1200,
"Bragança": 450,
"Setúbal": 1000,
"Aveiro": 1100,
"Funchal": 1300,
"Évora": 800,
"Beja": 600,
"Viseu": 700,
"Guimarães": 750,
"Leiria": 850,
"Vila Real": 500,
"Castelo Branco": 550,
"Guarda": 500,
"Santarém": 750,
"Ponta Delgada": 1000,
"Angra do Heroísmo": 800,
"Almada": 1700,
"Matosinhos": 1800,
"Viana do Castelo": 400,
"Tomar": 350,
"Chaves": 200,
"São João da Madeira": 230,
"Felgueiras": 300,
"Ovar": 300,
"Seixal": 430,
"Montijo": 350,
"Loulé": 300,
"Vila Franca de Xira": 320,
"Moura": 200,
"Silves": 180,
"Portimão": 280,
"Caldas da Rainha": 200,
"Peniche": 150,
"Elvas": 170,
"Vila do Conde": 300,
"Cartaxo": 200,
"Fafe": 150
}
RENDA_MODERADA_TETO = 2300
TAXA_ESFORCO_MAX = 0.40
root = Tk()
root.geometry("700x500")
root.resizable(0, 0)
root.config(bg="#103030")
root.title("Classificação da Renda Moderada")
titulo = Label(text="Classificação da Renda Moderada",
font=("Arial", 28, "bold"), bg="#103030", fg="#49e3e3")
titulo.place(relx=0.08, rely=0.05)
texto_sub1 = Label(text="Renda (€):",
font=("Arial", 18, "bold"), bg="#103030", fg="#49e3e3")
texto_sub1.place(relx=0.3, rely=0.2)
texto_sub2 = Label(text="Rendimento da Família (€):",
font=("Arial", 18, "bold"), bg="#103030", fg="#49e3e3")
texto_sub2.place(relx=0.05, rely=0.35)
texto_sub3 = Label(text="Cidade:",
font=("Arial", 18, "bold"), bg="#103030", fg="#49e3e3")
texto_sub3.place(relx=0.3, rely=0.5)
Renda = StringVar()
Renda_entrada = Entry(textvariable=Renda,
font=("Arial", 12, "bold"),
bg="white", fg="blue", justify='center')
Renda_entrada.place(relx=0.55, rely=0.21, relwidth=0.35)
Rendimento_Familia = StringVar()
Rendimento_Familia_entrada = Entry(textvariable=Rendimento_Familia,
font=("Arial", 12, "bold"),
bg="white", fg="blue", justify='center')
Rendimento_Familia_entrada.place(relx=0.55, rely=0.36, relwidth=0.35)
cidade = sorted(cidades.keys())
cidade_var = StringVar(value="Lisboa")
cidade_menu = OptionMenu(root, cidade_var, *cidade)
cidade_menu.config(font=("Arial", 12, "bold"), bg="white", fg="blue")
cidade_menu.place(relx=0.55, rely=0.51, relwidth=0.35)
def limpar():
Rendimento_Familia_entrada.delete(0, END)
Renda_entrada.delete(0, END)
resultado_texto.delete("1.0", END)
def app():
try:
renda = float(Renda.get())
rendimento_familia = float(Rendimento_Familia.get())
cidade = cidade_var.get()
renda_media_cidade = cidades[cidade]
taxa_esforco = renda / rendimento_familia if rendimento_familia > 0 else 0
taxa_percent = taxa_esforco * 100
esforco_status = "ABAIXO do limite" if taxa_esforco <= TAXA_ESFORCO_MAX else "ACIMA do limite"
rendimento_necessario = renda / TAXA_ESFORCO_MAX
if renda <= RENDA_MODERADA_TETO and taxa_esforco <= TAXA_ESFORCO_MAX:
classificacao = "✅ Pode ser classificada como RENDA MODERADA"
cor = "green"
else:
classificacao = "❌ NÃO pode ser classificada como RENDA MODERADA"
cor = "red"
resultado = (
f"Cidade selecionada: {cidade}\n"
f" - Renda média da cidade: {renda_media_cidade:.0f} €\n"
f" - Renda introduzida: {renda:.0f} €\n"
f" - Rendimento familiar: {rendimento_familia:.0f} €\n"
f" - Rendimento necessário (40% esforço): {rendimento_necessario:.0f} €\n"
f" - Taxa de esforço: {taxa_percent:.1f}% ({esforco_status})\n\n"
f"Classificação: {classificacao}"
)
resultado_texto.delete("1.0", END)
resultado_texto.insert(END, resultado)
resultado_texto.tag_configure("cor", foreground=cor, font=("Arial", 12, "bold"))
resultado_texto.tag_add("cor", "end-2l", "end-1l")
except ValueError:
resultado_texto.delete("1.0", END)
resultado_texto.insert(END, "⚠️ Por favor insira valores válidos (números).")
but1 = Button(text="Calcular", bd=2, bg='#107db2', fg='white',
font=('verdana', 12, 'bold'), command=app)
but1.place(relx=0.1, rely=0.6, 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.6, 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.6, relwidth=0.25, relheight=0.1)
resultado_texto = scrolledtext.ScrolledText(root,
font=("Arial", 12, "bold"),
bg="#cfe2f3", fg="black",
wrap=WORD)
resultado_texto.place(relx=0.05, rely=0.75, relwidth=0.9, relheight=0.2)
root.mainloop()