尝试使用通用命令功能创建动态菜单

时间:2013-12-28 02:56:52

标签: python menu tkinter

我正在尝试从列表中动态创建“最近的文件”菜单,然后使用常用功能处理所选文件。

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()

1 个答案:

答案 0 :(得分:3)

recent_menu.add_command(label=file_display, command=lambda i=i: processFile(i))

如果不使用i = i,则在运行时评估lambda变量,而不是声明时间。 - 这是lambda函数的默认值。