我正在尝试从列表中动态创建“最近的文件”菜单,然后使用常用功能处理所选文件。
Windows 7,Python 2.7
我可以成功创建菜单,但无法找到将指示器传递给公共功能以识别用户选择的方法。我一直在抨击Python的pass-by-reference;无论我尝试什么,创建的最后一个菜单参数值都会传递给命令函数。
我进行了广泛的搜索,没有找到任何帮助。 (我几乎得到它与'exec'一起使用,但是我在一个类中执行此处理并且'exec'似乎不喜欢self。函数)
我不在乎我能得到什么 - 索引,文件名,我可以用来确定选择了哪个条目。如果我完全偏离我的方法,请将我指向其他地方。我是一个Python新手,但是一个经验丰富的程序员,会真正感谢建设性的指导/批评。
这是我的最后一次尝试,它只是演示了我的问题。我尝试过的所有内容都有相同的结果 - 只返回最后一次列表迭代:
from Tkinter import *
def processFile(fileIndex):
print fileIndex
file_list = [('01','File01'),('02','File02'),('03','File03')]
root = Tk()
menu_bar = Menu(root)
file_menu = Menu(menu_bar)
recent_menu = Menu(file_menu)
Menu(file_menu)
for i, file in enumerate(file_list):
file_display = '%d %s' % (int(file[0]), file[1]) # Just making the menu pretty
recent_menu.add_command(label=file_display, command=lambda: processFile('%d' % i))
file_menu.add_cascade(label='Recent Files', menu=recent_menu)
menu_bar.add_cascade(label="File", menu=file_menu)
root.config(menu=menu_bar)
mainloop()
答案 0 :(得分:3)
recent_menu.add_command(label=file_display, command=lambda i=i: processFile(i))
如果不使用i = i,则在运行时评估lambda变量,而不是声明时间。 - 这是lambda函数的默认值。