Python:Tkinter菜单项传递的值不正确

Python:Tkinter菜单项传递的值不正确,python,menu,drop-down-menu,tkinter,menuitem,Python,Menu,Drop Down Menu,Tkinter,Menuitem,我目前正在为我的应用程序开发GUI(Tkinter)。我在创建两个下拉菜单时遇到了问题,这些菜单应该用来选择日期。我编写的应用程序创建了所需的带有标签的菜单,但是,通过单击任何按钮,只有最后一个菜单项的值才能传递给tkinter可变IntVar 这是代码中强调我的问题的一部分。年份应该是用户点击的年份,但总是2011年 from Tkinter import * import tkFileDialog as dialog import datetime import calendar wind

我目前正在为我的应用程序开发GUI(Tkinter)。我在创建两个下拉菜单时遇到了问题,这些菜单应该用来选择日期。我编写的应用程序创建了所需的带有标签的菜单,但是,通过单击任何按钮,只有最后一个菜单项的值才能传递给tkinter可变IntVar

这是代码中强调我的问题的一部分。年份应该是用户点击的年份,但总是2011年

from Tkinter import *
import tkFileDialog as dialog
import datetime
import calendar

window = Tk()
text = Text(window)
text.pack()

year = IntVar()
list_of_years = [1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011]

def year_seter(value):
  year.set(value)

menubar = Menu(window)
yearmenu = Menu(menubar)
for the_year in list_of_years:
  yearmenu.add_command(label=str(the_year), command=lambda : year_seter(the_year))
menubar.add_cascade(label = 'Year', menu=yearmenu)
window.config(menu=menubar)

label = Label(window, textvariable=year)
label.pack()
window.mainloop()
谁能给我解释一下,为什么会这样?
谢谢你抽出时间

命令更改为:

lambda the_year=the_year: year_seter(the_year)
问题在于Python如何查找
年份的值。
当你使用

lambda : year_seter(the_year)
年份
不在lambda函数的本地范围内,因此Python会在。它在全局范围内找到它。循环的
使用
,循环结束后,
保留其最后一个值2011。由于lambda函数是在for循环结束后执行的,因此Python分配给\u year
的值是2011

相反,如果使用具有默认值的参数,则默认值在定义函数(lambda)时固定。因此,每个
lambda
都将
年的不同值固定为默认值

现在,当lambda被调用时,Python再次寻找
年份的值,但这次在lambda的局部范围内找到它。它将默认值绑定到年


附言

  • 您也可以放弃定义年份设置,只需执行以下操作:

    lambda the_year=the_year: year.set(the_year)
    
  • 年份列表=范围(19952012)
    也有效

  • 很好的回答和解释。感谢您,我们在此以简化的形式介绍了年份设置和年份列表。