Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] IMC no Visual Studio

import tkinter as tk
from tkinter import messagebox

def calcularImc(peso_str, altura_cm_str):
    try:
        peso = float(peso_str)
        altura_cm = float(altura_cm_str)

        if altura_cm <= 0:
            return "Altura não pode ser zero ou negativa.", "Erro"

        altura_m = altura_cm / 100.0 # Convert cm to meters for IMC calculation
        imc = peso / (altura_m * altura_m)
        imc = round(imc, 2)

        if imc < 18.6:
            classificacao = "abaixo do peso"
        elif imc < 25:
            classificacao = "peso normal"
        elif imc < 30:
            classificacao = "sobrepeso"
        elif imc < 35:
            classificacao = "obesidade grau 1"
        elif imc < 40:
            classificacao = "obesidade grau 2"
        else:
            classificacao = "obesidade grau 3(mórbida)"
        return classificacao, imc
    except ValueError:
        return "Entrada inválida. Por favor, insira números válidos.", "Erro"

# The Tkinter GUI code below is commented out because it requires a graphical display
# which is not available in Google Colab notebooks. If you wish to run the GUI,
# please execute this code in a local Python environment with a display.

# janela = tk.Tk()
# janela.title("Calculadora de IMC")
# janela.geometry("500x500")

# # Rótulos e entradas
# tk.Label (janela, text="Nome:").pack(pady=5)
# # Note: entry_altura was defined twice in the original code, overwriting the first instance.
# entry_altura = tk.Entry (janela)
# entry_altura.pack()

# tk.Label (janela, text="Peso (kg):", font=("Arial", 10)).pack(pady=5)
# entry_peso = tk.Entry (janela)
# entry_peso.pack()

# tk.Label (janela, text="Altura (cm):").pack(pady=5)
# entry_altura = tk.Entry (janela)
# entry_altura.pack()

# botao = tk.Button(janela, text="calcular IMC", command=calcularImc)
# botao.pack(pady=15)

# resultado = tk.StringVar()
# resultado.set("Resultado")
# # Note: .pack was missing parentheses in the original code (tk.Label(...).pack)
# tk.Label(janela, textvariable=resultado).pack()
# janela.mainloop()


# --- Example of using the IMC calculation logic in Colab (without GUI) ---
if __name__ == "__main__":
    print("--- Calculadora de IMC (versão sem GUI) ---")

    # Test Case 1
    test_peso_1 = "70"  # kg
    test_altura_cm_1 = "175" # cm
    classificacao_1, imc_1 = calcularImc(test_peso_1, test_altura_cm_1)
    print(f"\nPara Peso: {test_peso_1} kg, Altura: {test_altura_cm_1} cm")
    print(f"IMC: {imc_1}")
    print(f"Classificação: {classificacao_1}")

    # Test Case 2
    test_peso_2 = "90" # kg
    test_altura_cm_2 = "180" # cm
    classificacao_2, imc_2 = calcularImc(test_peso_2, test_altura_cm_2)
    print(f"\nPara Peso: {test_peso_2} kg, Altura: {test_altura_cm_2} cm")
    print(f"IMC: {imc_2}")
    print(f"Classificação: {classificacao_2}")

    # Test with invalid input
    print("\n--- Teste de Entrada Inválida ---")
    classificacao_invalid, imc_invalid = calcularImc("abc", "170")
    print(f"Resultado: {classificacao_invalid}")

    # Test with zero height
    print("\n--- Teste de Altura Zero ---")
    classificacao_zero_height, imc_zero_height = calcularImc("70", "0")
    print(f"Resultado: {classificacao_zero_height}")
1 resposta

Olá, Marcos! Como vai?

Primeiramente, seja bem-vindo à Alura!

Vi que você explorou o Tkinter para criar uma interface gráfica em Python, utilizou muito bem o tratamento de exceções com try/except para validar entradas e ainda compreendeu a importância da função de cálculo separada para organizar melhor a lógica do programa.

Continue postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Se quiser aprofundar ainda mais, algumas boas práticas são:

  • Validar entradas: impedir que campos vazios sejam processados.
  • Separar lógica e interface: manter funções de cálculo independentes da GUI.
  • Adicionar feedback visual: usar messagebox.showinfo para mostrar mensagens claras ao usuário.

Alguns materiais podem estar em inglês, mas é possível compreendê-los usando o recurso de tradução de páginas do próprio navegador.

Ah, uma pergunta: você acha que seria mais interessante evoluir sua calculadora para mostrar mensagens com messagebox ou prefere manter apenas o rótulo de resultado na janela para simplificar?

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!