如何在类中实现以列表为默认值、字典为下拉选项的tkinter combobox循环
Tkinter Combobox循环生成设置默认值解决方案
你需要对现有代码做三处核心调整即可实现需求:
- 循环生成控件时避免用实例属性存储单实例,否则后续生成的控件会覆盖之前的实例
- 每个Combobox绑定的StringVar创建时直接传入self.houses对应的元素作为初始值
- 修正事件绑定的晚绑定问题与回调函数参数匹配问题
完整可运行修改后代码
import tkinter as tk from tkinter.ttk import Combobox root= tk.Tk() root.minsize(550,450) root.maxsize(560,460) root.title('mymyAPP') class My_Guess(tk.Frame): def __init__(self, parent): tk.Frame.__init__(self, parent) self.parent = parent self.heroes = {'wonder woman':'wonder woman', 'iron man': 'iron man', 'astroboy':'astroboy'} self.houses = [ 'DC', 'Dark Horse', 'Marvel'] # 新增列表存储所有生成的combobox和对应变量,方便后续取值 self.cmb_list = [] self.cmb_var_list = [] self.select_house_hero() def select_house_hero(self): for index, definition in enumerate(self.houses): # 创建StringVar时直接传入当前house作为默认值 current_var = tk.StringVar(value=definition) current_cmb = Combobox(self, values=list(self.heroes.keys()), justify="center", textvariable=current_var, state="readonly") # 修正lambda晚绑定问题,通过默认参数传入当前循环的控件和变量 current_cmb.bind('<<ComboboxSelected>>', lambda event, cmb=current_cmb, var=current_var, house=definition: self.get_results_from_ComboBox(event, cmb, var, house)) current_cmb.grid(row=(1 + index), column=0, sticky='w') # 存入列表方便后续调用 self.cmb_list.append(current_cmb) self.cmb_var_list.append(current_var) def get_results_from_ComboBox(self, event, cmb, var, origin_house): # 此处可编写你的业务逻辑,示例为打印选中结果 selected_hero = var.get() print(f"原厂商:{origin_house},选中英雄:{selected_hero}") if __name__ == '__main__': app = My_Guess(root) app.grid(row=0, column=0, sticky='nsew') root.mainloop()
关键改动说明
- 移除了重复的import语句,优化导入逻辑
- 新增两个列表存储所有生成的Combobox和对应的StringVar,避免循环内的实例属性覆盖问题,同时方便后续批量读取所有下拉框的选中值,适配你大量数据处理的需求
- 创建StringVar时直接传入
value=definition参数,即可实现每个下拉框默认显示对应house的需求 - 修正了lambda的晚绑定问题,通过参数默认值的方式将当前循环的控件、变量和对应house传入回调函数,避免所有事件都只能拿到最后一个控件的问题
- 补全了回调函数的参数,方便你后续处理匹配逻辑
内容的提问来源于stack exchange,提问作者pkanda
相关产品推荐
相关产品推荐

