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()方法来获取选中值。
修复方案
- 在
calcular_gordura函数内添加sexo = var.get(),通过var.get()获取单选按钮当前选中的数值(1或0) - 增加性别未选择的判断,避免程序报错
- 额外优化:添加输入值异常捕获、重置单选按钮状态、修正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
相关产品推荐
相关产品推荐

