正在做一个计算跑步机跑步期间燃烧卡路里的程序。该程序的基本功能已经实现,但需要添加一个功能,允许用户选择他们喜欢的测量单位,例如磅(lbs)或千克(kg)。我尝试使用 Checkbutton 来实现这个功能,但我无法弄清楚如何让选中的 Checkbutton 更改函数。如果用户选择“磅”,则需要将值除以大约 2.2 来将其转换为千克。请提供一些帮助。以下是我程序的代码:
from tkinter import *
def calculate():
mass = float(mass1.get())
gradient_q = float(gradient1.get())
gradient = gradient_q/100
minutes = float(minutes1.get())
seconds = float(seconds1.get())
speed = float(speed1.get())
vo2 = 3.5 + (0.2 * (speed * 26.82))+(gradient * (speed * 26.82) * 0.9)
mets = vo2 / 3.5
cal_m = (vo2 * mass)/1000 * 5.05
total_cal = ((seconds/60) + minutes) * cal_m
tcal = Label(window, text='total calories burned:%.2f' % total_cal).grid(row=8,column=1)
return
window = Tk()
window.title('Calorie Calculator')
window.geometry('400x600')
title=Label(window,text='Treadmill Calorie Counter', font='bold').grid(columnspan=4)
title=Label(window,text='').grid(columnspan=2)
mass1 = StringVar()
gradient1 = StringVar()
minutes1 = StringVar()
seconds1 = StringVar()
speed1 = StringVar()
var=StringVar()
mass=Label(window,text='Mass').grid(row=2,column=0)
mass_e=Entry(window, textvariable=mass1).grid(row=2,column=1)
c = Checkbutton (window, text='kg').grid(row=2,column=2)
c = Checkbutton (window, text='lbs').grid(row=2, column=3)
gradient=Label(window,text='Gradient').grid(row=3,column=0)
gradient_e=Entry(window, textvariable=gradient1).grid(row=3,column=1)
minutes=Label(window,text='Minutes').grid(row=4,column=0)
minutes_e=Entry(window, textvariable=minutes1).grid(row=4,column=1)
seconds=Label(window,text='Seconds').grid(row=5,column=0)
seconds_e=Entry(window, textvariable=seconds1).grid(row=5,column=1)
speed=Label(window,text='Speed').grid(row=6,column=0)
speed_e=Entry(window, textvariable=speed1).grid(row=6,column=1)
c = Checkbutton (window, text='kph',variable=var).grid(row=6,column=2)
c = Checkbutton (window, text='mph').grid(row=6, column=3)
calculate = Button(window, text='Calculate',command=calculate).grid(row=7,column=1)
window.mainloop()
2、解决方案
答题者提供了一个修改后的代码,该代码添加了以下功能:
- 使用 Checkbutton 按钮来选择测量单位(千克或磅)。
- 根据选中的单位,程序会将质量值转换为千克或磅。
- 程序会根据选定的单位自动更改计算公式。
修改后的代码如下:
from tkinter import *
def calculate():
# 确定选中的单位是千克还是磅
if cbUnit[0].get() == 1:
unit = "kg"
else:
unit = "lbs"
# 将质量值转换为选定的单位
if unit == "kg":
mass_kg = float(mass1.get())
else:
mass_kg = float(mass1.get()) * 0.453592
# 根据选定的单位,使用相应的计算公式
if unit == "kg":
vo2 = 3.5 + (0.2 * (speed * 26.82))+(gradient * (speed * 26.82) * 0.9)
else:
vo2 = 3.5 + (0.2 * (speed * 15.0778))+(gradient * (speed * 15.0778) * 0.9)
mets = vo2 / 3.5
cal_m = (vo2 * mass_kg)/1000 * 5.05
total_cal = ((seconds/60) + minutes) * cal_m
tcal = Label(window, text='total calories burned:%.2f' % total_cal).grid(row=8,column=1)
def changeCB(buttons,no):
# 确保只有一个 Checkbutton 处于选中状态
for i in range(0,len(buttons)):
if i <> no:
buttons[i].set(0)
window = Tk()
window.title('Calorie Calculator')
window.geometry('400x600')
title=Label(window,text='Treadmill Calorie Counter', font='bold').grid(columnspan=4)
title=Label(window,text='').grid(columnspan=2)
mass1 = StringVar()
gradient1 = StringVar()
minutes1 = StringVar()
seconds1 = StringVar()
speed1 = StringVar()
var=StringVar()
mass=Label(window,text='Mass').grid(row=2,column=0)
mass_e=Entry(window, textvariable=mass1).grid(row=2,column=1)
# 创建两个 Checkbutton 按钮,分别代表千克和磅
cbUnit = []
for i in range(0,2):
cbUnit.append(0)
cbUnit[i] = IntVar()
cbUnit[0].set(1)
c = Checkbutton (window, text='kg',variable=cbUnit[0],command = lambda: changeCB(cbUnit,0)).grid(row=2,column=2)
c = Checkbutton (window, text='lbs',variable=cbUnit[1],command = lambda: changeCB(cbUnit,1)).grid(row=2, column=3)
gradient=Label(window,text='Gradient').grid(row=3,column=0)
gradient_e=Entry(window, textvariable=gradient1).grid(row=3,column=1)
minutes=Label(window,text='Minutes').grid(row=4,column=0)
minutes_e=Entry(window, textvariable=minutes1).grid(row=4,column=1)
seconds=Label(window,text='Seconds').grid(row=5,column=0)
seconds_e=Entry(window, textvariable=seconds1).grid(row=5,column=1)
speed=Label(window,text='Speed').grid(row=6,column=0)
speed_e=Entry(window, textvariable=speed1).grid(row=6,column=1)
# 创建两个 Checkbutton 按钮,分别代表公里/小时和英里/小时
cbSpeed = []
for i in range(0,2):
cbSpeed.append(0)
cbSpeed[i] = IntVar()
cbSpeed[0].set(1)
c = Checkbutton (window, text='kph',variable=cbSpeed[0],command = lambda: changeCB(cbSpeed,0)).grid(row=6,column=2)
c = Checkbutton (window, text='mph',variable=cbSpeed[1],command = lambda: changeCB(cbSpeed,1)).grid(row=6, column=3)
calculate = Button(window, text='Calculate',command=calculate).grid(row=7,column=1)
window.mainloop()
这个修改后的代码可以满足用户选择测量单位的需求,并根据所选单位自动调整计算公式。