You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在类中实现以列表为默认值、字典为下拉选项的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()

关键改动说明

  1. 移除了重复的import语句,优化导入逻辑
  2. 新增两个列表存储所有生成的Combobox和对应的StringVar,避免循环内的实例属性覆盖问题,同时方便后续批量读取所有下拉框的选中值,适配你大量数据处理的需求
  3. 创建StringVar时直接传入value=definition参数,即可实现每个下拉框默认显示对应house的需求
  4. 修正了lambda的晚绑定问题,通过参数默认值的方式将当前循环的控件、变量和对应house传入回调函数,避免所有事件都只能拿到最后一个控件的问题
  5. 补全了回调函数的参数,方便你后续处理匹配逻辑

内容的提问来源于stack exchange,提问作者pkanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:36:07