Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| from datetime import date | |
| # ========================= | |
| # FUNÇÕES | |
| # ========================= | |
| def adicionar_transacao(tipo, descricao, categoria, valor, data, transacoes): | |
| if not descricao: | |
| return transacoes, atualizar_resumo(transacoes), "Digite uma descrição." | |
| if not valor or valor <= 0: | |
| return transacoes, atualizar_resumo(transacoes), "Digite um valor maior que zero." | |
| nova_transacao = { | |
| "tipo": tipo, | |
| "descricao": descricao, | |
| "categoria": categoria, | |
| "valor": valor, | |
| "data": data | |
| } | |
| transacoes.append(nova_transacao) | |
| return ( | |
| transacoes, | |
| atualizar_resumo(transacoes), | |
| f"✅ {tipo} adicionada com sucesso!" | |
| ) | |
| def atualizar_resumo(transacoes): | |
| receitas = sum( | |
| t["valor"] for t in transacoes | |
| if t["tipo"] == "Receita" | |
| ) | |
| despesas = sum( | |
| t["valor"] for t in transacoes | |
| if t["tipo"] == "Despesa" | |
| ) | |
| saldo = receitas - despesas | |
| texto = f""" | |
| ## 💰 Resumo financeiro | |
| **Receitas:** R$ {receitas:,.2f} | |
| **Despesas:** R$ {despesas:,.2f} | |
| **Saldo:** R$ {saldo:,.2f} | |
| **Quantidade de lançamentos:** {len(transacoes)} | |
| """ | |
| return texto | |
| def mostrar_transacoes(transacoes): | |
| if not transacoes: | |
| return "Nenhuma transação cadastrada." | |
| texto = "## 📋 Transações\n\n" | |
| for i, t in enumerate(reversed(transacoes), 1): | |
| sinal = "+" if t["tipo"] == "Receita" else "-" | |
| texto += ( | |
| f"**{i}. {t['descricao']}** \n" | |
| f"📅 {t['data']} | 🏷️ {t['categoria']} \n" | |
| f"{sinal} R$ {t['valor']:,.2f} \n\n" | |
| ) | |
| return texto | |
| def adicionar_e_atualizar( | |
| tipo, | |
| descricao, | |
| categoria, | |
| valor, | |
| data, | |
| transacoes | |
| ): | |
| novas_transacoes, resumo, mensagem = adicionar_transacao( | |
| tipo, | |
| descricao, | |
| categoria, | |
| valor, | |
| data, | |
| transacoes | |
| ) | |
| lista = mostrar_transacoes(novas_transacoes) | |
| return ( | |
| novas_transacoes, | |
| resumo, | |
| lista, | |
| mensagem, | |
| "", | |
| None | |
| ) | |
| def limpar_transacoes(): | |
| transacoes = [] | |
| return ( | |
| transacoes, | |
| atualizar_resumo(transacoes), | |
| mostrar_transacoes(transacoes), | |
| "🗑️ Todas as transações foram apagadas." | |
| ) | |
| # ========================= | |
| # INTERFACE | |
| # ========================= | |
| with gr.Blocks( | |
| title="Meu Controle Financeiro" | |
| ) as app: | |
| transacoes = gr.State([]) | |
| gr.Markdown( | |
| """ | |
| # 💰 Meu Controle Financeiro | |
| Controle suas **receitas, despesas e saldo** de forma simples. | |
| """ | |
| ) | |
| with gr.Row(): | |
| with gr.Column(): | |
| gr.Markdown("## ➕ Nova transação") | |
| tipo = gr.Radio( | |
| ["Receita", "Despesa"], | |
| value="Despesa", | |
| label="Tipo" | |
| ) | |
| descricao = gr.Textbox( | |
| label="Descrição", | |
| placeholder="Ex: Supermercado" | |
| ) | |
| categoria = gr.Dropdown( | |
| [ | |
| "Alimentação", | |
| "Transporte", | |
| "Moradia", | |
| "Contas", | |
| "Lazer", | |
| "Saúde", | |
| "Educação", | |
| "Salário", | |
| "Investimentos", | |
| "Outros" | |
| ], | |
| value="Outros", | |
| label="Categoria" | |
| ) | |
| valor = gr.Number( | |
| label="Valor (R$)", | |
| minimum=0 | |
| ) | |
| data = gr.Textbox( | |
| label="Data", | |
| value=str(date.today()) | |
| ) | |
| adicionar = gr.Button( | |
| "➕ Adicionar", | |
| variant="primary" | |
| ) | |
| mensagem = gr.Markdown() | |
| with gr.Column(): | |
| resumo = gr.Markdown( | |
| atualizar_resumo([]) | |
| ) | |
| gr.Markdown("---") | |
| lista = gr.Markdown( | |
| "Nenhuma transação cadastrada." | |
| ) | |
| apagar = gr.Button( | |
| "🗑️ Apagar todas as transações" | |
| ) | |
| adicionar.click( | |
| adicionar_e_atualizar, | |
| inputs=[ | |
| tipo, | |
| descricao, | |
| categoria, | |
| valor, | |
| data, | |
| transacoes | |
| ], | |
| outputs=[ | |
| transacoes, | |
| resumo, | |
| lista, | |
| mensagem, | |
| descricao, | |
| valor | |
| ] | |
| ) | |
| apagar.click( | |
| limpar_transacoes, | |
| outputs=[ | |
| transacoes, | |
| resumo, | |
| lista, | |
| mensagem | |
| ] | |
| ) | |
| if __name__ == "__main__": | |
| app.launch() |