使用 Python 的 Tkinter 创建动态菜单(例如最近的文件列表)
Creating dynamic menus (eg Recent file list) with Python's Tkinter
我是一名经验丰富的 Python 程序员,但目前需要通过 Tkinter 实现基本的 GUI。很明显,Python 并没有努力成为最好的 UI/UX 平台,我完全明白了这一点,但我遇到了一个基本问题,我似乎无法找到一个简单的解决方案网络。
我需要实现一个可变长度的最近文件列表。所以我尝试这样做:
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
的值始终相同,即它的最后一个值。那么,如何从所选菜单项中获取唯一标识符(名称、索引等)?
您必须将 lambda 更改为如下所示:
recent_list.add_command(label=name, command=lambda i = index: self.__open_recent(i))
这会将正确的索引传递给函数。
我是一名经验丰富的 Python 程序员,但目前需要通过 Tkinter 实现基本的 GUI。很明显,Python 并没有努力成为最好的 UI/UX 平台,我完全明白了这一点,但我遇到了一个基本问题,我似乎无法找到一个简单的解决方案网络。
我需要实现一个可变长度的最近文件列表。所以我尝试这样做:
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
的值始终相同,即它的最后一个值。那么,如何从所选菜单项中获取唯一标识符(名称、索引等)?
您必须将 lambda 更改为如下所示:
recent_list.add_command(label=name, command=lambda i = index: self.__open_recent(i))
这会将正确的索引传递给函数。