Python 将整数指定给选项菜单

Python 将整数指定给选项菜单,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我已尝试将整数值指定给我的选项菜单。当我尝试从calculate函数计算总和时,只计算bmr和tef,我使用字典存储与optionmenus选项相关的值 from tkinter import * from tkinter import ttk root = Tk() root.title("Calorie Calculator") mainframe = ttk.Frame(root) mainframe.grid(column = 0, row = 0) root.c

我已尝试将整数值指定给我的选项菜单。当我尝试从calculate函数计算总和时,只计算bmr和tef,我使用字典存储与optionmenus选项相关的值

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Calorie Calculator")

mainframe = ttk.Frame(root)
mainframe.grid(column = 0, row = 0)
root.columnconfigure(0, weight = 1)
root.rowconfigure(0, weight = 1)

ttk.Label(mainframe, text = "Weight").grid(column = 0, row = 0)
ttk.Label(mainframe, text = "Enter weight in kilos").grid(column = 2, row = 0)
ttk.Label(mainframe, text = "BMR is").grid(column = 0, row = 1)
ttk.Label(mainframe, text = "TEF is").grid(column = 0, row = 2)
ttk.Label(mainframe, text = "EEE").grid(column = 0, row = 3)
Label(mainframe, text = "Enter excersise activity").grid(column = 2, row = 3)
ttk.Label(mainframe, text = "NEAT").grid(column = 0, row = 4)
Label(mainframe, text = "Does your job require you to be physically active?").grid(column = 2, row = 4)

bmr = StringVar()
ttk.Label(mainframe, textvariable = bmr).grid(column = 1, row = 1)

tef = StringVar()
ttk.Label(mainframe, textvariable = tef).grid(column = 1, row = 2)

tdee = StringVar()
ttk.Label(mainframe, textvariable = tdee).grid(column = 1, row = 6)

exercise_vals = {"Light": 250, "Moderate": 325, "Advanced": 425, "Athlete": 500}
exercise = StringVar()
drop_eee = OptionMenu(mainframe, exercise, *exercise_vals).grid(column = 1, row = 3)

job_activity_vals = {"Yes": 250, "No": 500}
job_activity = StringVar()
drop_neat = OptionMenu(mainframe, job_activity, *job_activity_vals).grid(column = 1, row = 4)


weight = StringVar()
weight_entry = ttk.Entry(mainframe, textvariable = weight).grid(column = 1, row = 0)

def calculate(*args):
    try:
        weight_val = float(weight.get())
        bmr_val = weight_val * 20
        bmr_val = bmr.set(bmr_val)
        tef_val = float(bmr.get()) * 0.1
        tef_val = tef.set(tef_val)
        eee_val = float(exercise.get())
        neat_val = float(job_activity.get())
        tdee_val = bmr_val + tef_val + eee_val + neat_val
        tdee_val = tdee.set(tdee_val)
    except ValueError:
        pass

ttk.Button(mainframe, text = "Calculate TDEE", command = calculate).grid(column = 2, row = 5)

root.mainloop()

由于您使用了
尝试/except
忽略
浮动(exercise.get())
浮动(job\u activity.get())
上发生的
值错误。这就是为什么没有得到
tdee
的结果

引发的
ValueError
是由于:

  • exercise.get()
    将返回类似于
    Light
    mediate
    等的内容
  • job\u activity.get()
    将返回类似
    Yes
    No
因此,对这些值使用
float()
将引发
ValueError

您应该从字典
练习值
作业活动值
中获取值

还包括以下行:

  • bmr\u val=bmr.set(bmr\u val)
  • tef_val=tef.set(tef_val)
None
分配给
bmr\u val
tef\u val

下面是修改后的
calculate()
,以解决上述问题:

def计算(*args):
尝试:
weight\u val=float(weight.get())
bmr_val=重量_val*20
bmr.set(bmr_val)
tef_val=float(bmr.get())*0.1
tef.set(tef_val)
eee_val=float(exercise_val[exercise.get()])#从字典中获取值
neat_val=float(作业活动[作业活动.get())#从字典中获取值
tdee_val=bmr_val+tef_val+eee_val+neat_val
tdee.set(tdee_val)
除ValueError为e外:
#最好显示错误消息,而不是忽略它
打印(“ValueError”,e)

try将忽略发生的错误。将其删除并编码,然后仅在适当设置下使用。这里发生了很多错误。从
ValueError
开始直到
TypeError
。您应该首先尝试了解所有这些意味着什么,然后从头开始编写代码。你还忘了用字典做索引。