如何从Tkinter菜单中正确获取选中的文件夹编号?
问题分析
你的代码存在两个关键问题,导致无法正确获取选中的文件夹编号:
callback函数里硬编码遍历range(2),只会打印菜单的前两个条目,和你实际选中的选项完全无关;- 循环创建菜单命令时,
lambda没有捕获当前迭代的folder值,也没把选中的文件夹编号传递给回调函数。
修正后的代码
from tkinter import * import tkinter as tk from tkinter import ttk root = Tk() root.geometry("300x150") frame = Frame(root) frame.pack() menu_frame = Menu(root) file_menu = Menu(menu_frame, tearoff=0) folders = ['25', '70', '200'] sub_menu = Menu(menu_frame, tearoff=0) # 给lambda绑定当前的folder变量,确保每个菜单命令传递对应编号 for folder in folders: sub_menu.add_command(label=folder, command=lambda f=folder: callback(f)) file_menu.add_cascade(label='Open folder... ', menu=sub_menu) menu_frame.add_cascade(label='File', menu=file_menu) file_menu.add_separator() file_menu.add_command(label='Exit', command=root.destroy) # 直接接收选中的文件夹编号,无需遍历菜单 def callback(selected_folder): print(f"选中的文件夹编号:{selected_folder}") # 这里可以添加你的数据处理逻辑,比如: # process_selected_folder(selected_folder) # 配置窗口菜单,原代码遗漏了这一步,否则菜单不会显示 root.config(menu=menu_frame) root.mainloop()
关键修改说明
- lambda绑定变量:用
lambda f=folder: callback(f)把当前迭代的folder值固定到lambda参数里,避免所有菜单命令都指向同一个变量; - 简化回调逻辑:直接让
callback接收选中的编号,不用再去遍历菜单条目,逻辑更直接; - 补充菜单配置:加上
root.config(menu=menu_frame),否则菜单不会显示在窗口上,原代码漏掉了这个关键步骤。
修改后点击对应文件夹选项,就能正确输出选中的编号,直接用于后续的数据处理。
内容的提问来源于stack exchange,提问作者Qvch
相关产品推荐
相关产品推荐

