代码之家  ›  专栏  ›  技术社区  ›  Paul

用Python的Tkinter创建动态菜单(例如最近的文件列表)

  •  0
  • Paul  · 技术社区  · 5 年前

    我是一个经验丰富的Python程序员,但目前需要通过Tkinter实现一个基本的GUI。很明显,Python并没有成为最好的UI/UX平台,我已经完成了这个目标,但是我遇到了一个基本的问题,我似乎无法在web上找到一个简单的解决方案。

    def __file_menu(self):
            menu = tk.Menu(self, tearoff=False)
            menu.add_command(label="New Project...", command=self.__file_new, state=tk.DISABLED)
            menu.add_command(label="Open Project...", command=self.__file_open)
            recent_list = tk.Menu(menu, tearoff=False)
            for index, project in enumerate(self._recent_projects):
                name = os.path.basename(project).title()
                recent_list.add_command(label=name, command=lambda: self.__open_recent(index))
            menu.add_cascade(label="Recent Projects...", menu=recent_list)
    

    这对于显示正确的项目很有帮助,但我无法正确地在lambda函数中传递一个唯一的值,该值标识已选择哪些菜单项,以便我可以在此处使用它:

        def __open_recent(self, item):
            self.__load_project(self._recent_projects[item])
    

    index 总是相同的,即它的最后一个值。那么,如何从选中的菜单项中获得唯一标识符(名称、索引等)?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Henry    5 年前

    你必须把lambda改成这样:

    recent_list.add_command(label=name, command=lambda i = index: self.__open_recent(i))
    

    这会将正确的索引传递给函数。