使用循环创建任意数量Tkinter OptionMenu及获取选中值问题
问题分析
你的现有代码存在两个核心问题:
- 仅用字典存储了
StringVar变量,没有保存OptionMenu的控件实例,导致无法对指定菜单进行删除操作 - 删除逻辑错误,用Label覆盖不是真正移除控件的方式
解决方案
1. 调整存储结构:同时保存变量与控件实例
修改字典结构,让每个键对应一个包含StringVar和OptionMenu控件的子字典,这样既能获取选中值,也能操作控件。
2. 获取所有OptionMenu的选中值
遍历字典,对每个条目里的StringVar调用get()方法即可拿到当前选中值。
3. 正确删除指定OptionMenu
直接调用目标OptionMenu控件的destroy()方法(彻底删除控件,无法恢复),或者grid_forget()方法(仅隐藏,后续可重新显示)。
完整修改代码
import tkinter as tk def erase_option(): # 获取第5个OptionMenu(索引从0开始,对应row=4) target_name = "optionmenu4" if target_name in options: # 彻底删除控件 options[target_name]['widget'].destroy() # 从字典中移除该条目(可选操作) del options[target_name] # 打印所有剩余OptionMenu的选中值 print("当前所有选中值:") for name, data in options.items(): print(f"{name}: {data['var'].get()}") root = tk.Tk() Dropdownoptions = ["option1", "option2", "option3"] maxval = 10 options = {} for om_idx, row in zip(range(maxval), range(maxval)): name = f"optionmenu{om_idx}" var = tk.StringVar() # 设置默认选中第一个选项 var.set(Dropdownoptions[0]) # 创建OptionMenu控件 om_widget = tk.OptionMenu(root, var, *Dropdownoptions) om_widget.grid(column=0, row=row) # 将变量和控件存入字典 options[name] = {"var": var, "widget": om_widget} button = tk.Button(root, text="Erase 5th option", command=erase_option) button.grid(column=0, row=maxval) root.mainloop()
代码说明
- 创建OptionMenu时,同时把
StringVar和控件实例存入字典,键为你定义的命名(如optionmenu4) - 删除函数中,通过键找到目标控件,调用
destroy()即可彻底移除 - 遍历字典时,通过
data['var'].get()获取对应菜单的选中值
内容的提问来源于stack exchange,提问作者Luke-McDevitt
相关产品推荐
相关产品推荐

