Python Tkinter中StringVar变量求和结果不符合预期问题排查
问题修复方案
错误原因
- 早期输出00的问题:
imp_var和man_var都是StringVar类型对象,没有调用.get()方法的前提下,直接转换为字符串或者相加,操作的是对象本身而非其存储的数值,自然得到错误的拼接结果。 - 调用
.get()后输出仍为0的问题:你把val_var的计算逻辑放在了添加任务窗口初始化的位置,窗口刚弹出时两个下拉框都是默认值0,此时就已经算出了val_var=0,后续用户修改下拉框的选择时,val_var不会自动更新。
修复方法
把val_var的计算逻辑移动到用户点击「Next」按钮触发的add_task函数内部,提交时再实时读取两个下拉框的最新值计算即可。
修改后的open_add_task函数代码如下:
def open_add_task(): taskwin = Toplevel(root) taskwin.focus_force() #TITLE titlelabel = Label(taskwin, text='Title task concisely:', font=('Roboto',11,'bold')).grid(column=1, row=0) name_entry = Entry(taskwin, width=40, justify='center') name_entry.grid(column=1, row=1) #IMPACT impactlabel = Label(taskwin, text='Impact', font=('Roboto',10)).grid(column=0, row=2) imp_var = StringVar(value=0) OptionMenu(taskwin, imp_var, *range(0, 10+1)).grid(column=0, row=3, sticky='ns') #MANAGEABILITY manlabel = Label(taskwin, text='Manageability', font=('Roboto',10)).grid(column=1, row=2) man_var = StringVar(value=0) OptionMenu(taskwin, man_var, *range(0, 10+1)).grid(column=1, row=3, sticky='nsew') #HOURS(required) hourlabel = Label(taskwin, text='Whole hours \n required', font=('Roboto',10)).grid(column=1, row=16) hour_entry = Entry(taskwin, width=4, justify='center') hour_entry.grid(column=1, row=17) def add_task(): if name_entry.get() != '': # If textbox inputfield is NOT empty do this: # 移到此处计算,实时获取用户最新选择的数值 val_var = int(imp_var.get()) + int(man_var.get()) task_list.append(Task(name_entry.get(), imp_var.get(), man_var.get(), hour_entry.get(), val_var)) show_tasks() listbox_tasks.insert(tkinter.END, name_entry.get()) name_entry.delete(0, tkinter.END) taskwin.destroy() else: tkinter.messagebox.showwarning(title='Whoops', message='You must enter a task') next_button = Button(taskwin, text='Next', font=('Roboto',10), command=add_task).grid(column=2, row=18, sticky="ne")
内容的提问来源于stack exchange,提问作者Karim Loberg
相关产品推荐
相关产品推荐

