如何使用 tkinter 中的 Checkbutton 来更改函数值?

40 阅读3分钟

正在做一个计算跑步机跑步期间燃烧卡路里的程序。该程序的基本功能已经实现,但需要添加一个功能,允许用户选择他们喜欢的测量单位,例如磅(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()

这个修改后的代码可以满足用户选择测量单位的需求,并根据所选单位自动调整计算公式。