You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter BMI及体脂率计算器:性别单选按钮与体脂公式绑定问题求助

解决Tkinter体脂率计算器性别变量获取问题

问题背景

开发用于学校项目的BMI和体脂率计算器,基于Tkinter GUI模板调整后,体脂率计算功能无法识别单选按钮的性别选择。体脂率计算公式为:

体脂率 = (1.2 * BMI) + (0.23 * idade) - (10.8 * sexo) - 5.4

其中sexo(性别)男性取1、女性取0。已通过Tkinter设置对应值的单选按钮,但calcular_gordura函数无法获取选中的性别值。

问题原因

在calcular_gordura函数中直接使用了未定义的sexo变量,未调用绑定单选按钮的IntVar对象的get()方法来获取选中值。

修复方案

  1. 在calcular_gordura函数内添加sexo = var.get(),通过var.get()获取单选按钮当前选中的数值(1或0)
  2. 增加性别未选择的判断,避免程序报错
  3. 额外优化:添加输入值异常捕获、重置单选按钮状态、修正IMC区间判断逻辑

修复后的calcular_gordura函数

def calcular_gordura():
    try:
        # 判断是否选择性别
        if var.get() not in [0, 1]:
            messagebox.showerror('Erro', 'Por favor, selecione o sexo!')
            return
        
        idade = int(idade_tf.get())
        kg = int(peso_tf.get())
        m = int(altura_tf.get()) / 100
        imc = kg / (m * m)
        imc = round(imc, 1)
        # 获取单选按钮的性别值
        sexo = var.get()
        gordura = (1.2*imc)+(0.23*idade)-(10.8*sexo)-5.4
        gordura = round(gordura, 1)
        percentual_de_gordura(gordura)
    except ValueError:
        messagebox.showerror('Erro', 'Por favor, insira valores válidos!')

完整修复代码

from tkinter import *
from tkinter import messagebox


def fazer_reset():
    idade_tf.delete(0, 'end')
    altura_tf.delete(0, 'end')
    peso_tf.delete(0, 'end')
    # 重置单选按钮选择状态
    var.set(-1)


def calcular_imc():
    try:
        kg = int(peso_tf.get())
        m = int(altura_tf.get()) / 100
        imc = kg / (m * m)
        imc = round(imc, 1)
        indice_de_imc(imc)
    except ValueError:
        messagebox.showerror('Erro', 'Por favor, insira valores válidos!')


def indice_de_imc(imc):
    if imc < 18.5:
        messagebox.showinfo('IMC', f'IMC = {imc} está Abaixo do peso')
    elif 18.5 <= imc <= 24.9:
        messagebox.showinfo('IMC', f'IMC = {imc} está Normal')
    elif 24.9 < imc <= 29.9:
        messagebox.showinfo('IMC', f'IMC = {imc} está Acima do peso')
    elif imc > 29.9:
        messagebox.showinfo('IMC', f'IMC = {imc} está Obeso')
    else:
        messagebox.showerror('IMC', 'algo deu errado!')


def calcular_gordura():
    try:
        # 判断是否选择性别
        if var.get() not in [0, 1]:
            messagebox.showerror('Erro', 'Por favor, selecione o sexo!')
            return
        
        idade = int(idade_tf.get())
        kg = int(peso_tf.get())
        m = int(altura_tf.get()) / 100
        imc = kg / (m * m)
        imc = round(imc, 1)
        sexo = var.get()
        gordura = (1.2*imc)+(0.23*idade)-(10.8*sexo)-5.4
        gordura = round(gordura, 1)
        percentual_de_gordura(gordura)
    except ValueError:
        messagebox.showerror('Erro', 'Por favor, insira valores válidos!')


def percentual_de_gordura(gordura):
    messagebox.showinfo('Percentual de Gordura', f'O percentual de gordura é de {gordura} %')


ws = Tk()
ws.title('Calculadora de IMC, Percentual de Gordura e Massa Corporal')
ws.geometry('400x300')
ws.config(bg='#686e70')

# 初始化var为-1,标记未选择性别状态
var = IntVar(value=-1)

frame = Frame(
    ws,
    padx=10,
    pady=10
)
frame.pack(expand=True)

idade_lb = Label(
    frame,
    text="Idade"
)
idade_lb.grid(row=1, column=1)

idade_tf = Entry(
    frame,
)
idade_tf.grid(row=1, column=2, pady=5)

sexo_lb = Label(
    frame,
    text='Sexo'
)
sexo_lb.grid(row=2, column=1)

frame2 = Frame(
    frame
)
frame2.grid(row=2, column=2, pady=5)

masculino_rb = Radiobutton(
    frame2,
    text='Masculino',
    variable=var,
    value=1
)
masculino_rb.pack(side=LEFT)

feminino_rb = Radiobutton(
    frame2,
    text='Feminino',
    variable=var,
    value=0
)
feminino_rb.pack(side=RIGHT)

altura_lb = Label(
    frame,
    text="Altura (cm)  "
)
altura_lb.grid(row=3, column=1)

peso_lb = Label(
    frame,
    text="Peso (kg)  ",

)
peso_lb.grid(row=4, column=1)

altura_tf = Entry(
    frame,
)
altura_tf.grid(row=3, column=2, pady=5)

peso_tf = Entry(
    frame,
)
peso_tf.grid(row=4, column=2, pady=5)

frame3 = Frame(
    frame
)
frame3.grid(row=5, columnspan=3, pady=10)

imc_btn = Button(
    frame3,
    text='IMC',
    command=calcular_imc
)
imc_btn.pack(side=LEFT)

gordura_btn = Button(
    frame3,
    text='Gordura',
    command=calcular_gordura
)
gordura_btn.pack(side=LEFT)

reset_btn = Button(
    frame3,
    text='Reset',
    command=fazer_reset
)
reset_btn.pack(side=LEFT)

sair_btn = Button(
    frame3,
    text='Sair',
    command=lambda: ws.destroy()
)
sair_btn.pack(side=RIGHT)

ws.mainloop()

内容的提问来源于stack exchange,提问作者Eduardo Holanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:30:47