Python:Tkinter菜单项未传递正确的值
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python:Tkinter菜单项未传递正确的值,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1692字,纯文字阅读大概需要3分钟。
内容图文
![Python:Tkinter菜单项未传递正确的值](/upload/InfoBanner/zyjiaocheng/673/6893eac027a9415bb5ca2d3f30e6159f.jpg)
我目前正在为我的应用程序开发GUI(Tkinter).我在创建几个应该用于选择日期的下拉菜单时遇到问题.我编写的应用程序使用标签创建所需的菜单,但是,通过单击任何按钮,只有最后一个菜单项的值才传递给tkinter可变的IntVar.
这是代码中强调我的问题的一部分. year应该是用户单击的年份,但是始终是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如何查找the_year的值有关.
使用时
lambda : year_seter(the_year)
the_year不在lambda函数的本地范围内,因此Python会在extended, global, then builtin scopes中寻找它.它在全局范围内找到它. for循环使用the_year,在for循环结束后,the_year保留其最后一个值2011.由于lambda函数在for循环结束后执行,因此Python分配给the_year的值为2011.
相反,如果您使用具有默认值的参数,则默认值在定义函数(lambda)时是固定的.因此,每个lambda都会获得固定为默认值的the_year的不同值.
现在,当调用lambda时,Python会再次查找the_year的值,但这一次是在lambda的本地范围内找到它的.它将默认值绑定到the_year.
PS.
>您也可以放弃定义year_seter,而只需执行以下操作:
lambda the_year=the_year: year.set(the_year)
> list_of_years = range(1995,2012)也可以.
内容总结
以上是互联网集市为您收集整理的Python:Tkinter菜单项未传递正确的值全部内容,希望文章能够帮你解决Python:Tkinter菜单项未传递正确的值所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。