Tkinter循环生成Combobox同步变动、无法获取选中值问题求助
Tkinter 批量生成Combobox问题修复方案
问题根因
- 所有下拉框同步变动:所有Combobox绑定了同一个全局
StringVar对象,Tkinter中绑定同一变量的控件会同步更新值,修改任意一个都会触发所有绑定该变量的控件同步变更。 - 无法正确存入选中值:循环生成的
mycombo是临时变量,循环结束后仅保留最后一个下拉框的引用,同时回调函数的遍历逻辑错误,没有正确获取选中值。
修正后完整代码
from tkinter import * from tkinter import ttk win = Tk() win.geometry('400x600') win.title('combobox') # 存储每个下拉框的最新选中值,初始化长度和生成的下拉框数量一致 result = [None] * 3 # 存储所有生成的下拉框实例 combo_list = [] anyFruits =['any_grape', 'any_tomato', 'any_banana'] fruits = {'specialgrape':'specialgrape', 'specialtomato':'specialtomato','specialbanana':'specialbanana'} for index, fruit in enumerate(anyFruits): # 去掉公共的textvariable绑定,每个下拉框独立存储值 mycombo = ttk.Combobox(win, values=list(fruits.keys())) mycombo.bind('<<ComboboxSelected>>', lambda event, index=index: fruit_callBack(index, event)) mycombo.pack() # 将当前下拉框实例存入列表,方便后续取值 combo_list.append(mycombo) def fruit_callBack(index, event): # 直接获取当前触发事件的下拉框选中值,按索引存入result对应位置 result[index] = event.widget.get() def print_(): print(result) bt = Button(win, text="打印选中结果", command=print_) bt.pack() win.mainloop()
逻辑说明
- 新增
combo_list存储所有下拉框实例,避免循环临时变量被回收,后续如果需要批量操作所有下拉框可以直接遍历该列表。 - 取消所有下拉框的公共
StringVar绑定,每个下拉框独立管理自己的选中值,不会出现同步变动问题。 - 回调函数中通过
event.widget直接获取触发当前选择事件的下拉框对象,调用get()方法拿到选中值后按传入的index存入result对应位置,保证取值和存储的位置一一对应。 - 如果需要存储所有历史选择记录而非最新值,可以把
result初始化改为空列表,回调函数里用result.append(event.widget.get())即可。
内容的提问来源于stack exchange,提问作者pkanda
相关产品推荐
相关产品推荐

