Python3.8中循环创建Tkinter Combobox时如何修正列表追加的长度异常问题
解决方案
问题根源
当前问题核心是每次选中下拉框选项时都调用append()往结果列表新增元素,没有区分不同下拉框对应的存储位置,因此长度会持续增长。
修改思路
- 提前初始化和下拉框数量一致的固定长度结果列表,用索引将每个下拉框和列表的对应位置绑定
- 每次选中事件触发时,直接修改对应索引位置的值,不再追加新元素
修改后代码
from tkinter import ttk from tkinter import Tk from tkinter import Button, StringVar, Label root = Tk() my_heroes = ['Zidane', 'Ronaldo', 'Messi'] position = ['The One!', 'more or less','the bad'] # 初始化固定长度的结果列表,长度和下拉框数量一致 result = [None] * len(my_heroes) # 新增index参数,用于定位对应下拉框的存储位置 def get_combo_choice(event, cmb, index): result[index] = cmb.get() print(result) def callback(): print(result) for index, heroe in enumerate(my_heroes): var = StringVar() bestPlayers = ttk.Combobox(root,values=position, textvariable=var, state="readonly") bestPlayers.grid(row=0 + index, column=1,padx=(15,25)) label = Label(root, text = heroe) label.grid(row=0 + index, column=0,padx=(15,25)) # 绑定时传入当前下拉框对应的索引 bestPlayers.bind("<<ComboboxSelected>>",lambda event, cmb=var, idx=index:get_combo_choice(event, cmb, idx)) button = Button(root, text ="get list of choices", command = callback) button.grid(row=4, column=0,padx=(15,25)) root.mainloop()
效果说明
修改后结果列表长度始终等于下拉框数量,每次修改任意下拉框的选项,只会更新列表中对应索引位置的值,最终直接读取result即可拿到所有下拉框的最新选择结果。
内容的提问来源于stack exchange,提问作者pkanda
相关产品推荐
相关产品推荐

