动态更新ttkwidgets AutocompleteCombobox的completevalues列表
结论
ttkwidgets.AutocompleteCombobox 原生支持动态设置条目列表,联动失效、抛出TypeError: config() takes 1 positional argument but 2 were given报错均为调用方式错误导致,并非组件不支持该能力。
报错根因
两个常见错误写法会触发该问题:
- 给
config()方法传选项列表时用了位置参数,没有指定values=关键字参数。AutocompleteCombobox重写了配置方法,不接受选项列表作为位置参数传入,这一点和部分场景下原生ttk.Combobox的容错写法不兼容。 - 仅更新了组件
values配置,没有同步更新组件内置的自动补全候选池,导致下拉选项、补全逻辑和实际配置不匹配。
正确实现方式
- 给第一个组合框绑定
<<ComboboxSelected>>虚拟事件,选中值变化时触发联动更新逻辑 - 事件回调中根据第一个组合框的当前值,筛选出第二个组合框对应的候选列表
- 用关键字参数的形式更新第二个组合框的
values配置,同时调用组件自带的set_completion_list()方法同步补全词库,最后清空第二个组合框的残留旧值
可直接运行的参考代码:
import tkinter as tk from ttkwidgets.autocomplete import AutocompleteCombobox # 定义两级选项的映射关系 option_mapping = { "省份": ["广东省", "浙江省", "江苏省"], "直辖市": ["北京市", "上海市", "重庆市", "天津市"], "自治区": ["内蒙古自治区", "广西壮族自治区", "西藏自治区"] } root = tk.Tk() # 一级选择框 combo_level1 = AutocompleteCombobox(root, values=list(option_mapping.keys())) combo_level1.pack(padx=20, pady=10) # 二级联动选择框 combo_level2 = AutocompleteCombobox(root) combo_level2.pack(padx=20, pady=10) def sync_level2_options(event=None): current_selected = combo_level1.get() target_options = option_mapping.get(current_selected, []) # 用关键字参数更新下拉选项,禁止直接传列表作为位置参数 combo_level2.config(values=target_options) # 同步更新自动补全的内置候选池 combo_level2.set_completion_list(target_options) # 清空上一次选择的残留值 combo_level2.set("") # 绑定选中事件触发联动 combo_level1.bind("<<ComboboxSelected>>", sync_level2_options) root.mainloop()
注意事项
- 禁止使用
combo.config(选项列表)的位置参数传参写法,必须写成combo.config(values=选项列表),否则会直接触发你遇到的类型错误 set_completion_list()是AutocompleteCombobox独有的方法,原生ttk.Combobox不需要这一步,替换组件后必须补上,否则输入时的自动补全不会匹配新的选项列表- 如果需要联动后默认选中二级框的第一个选项,在更新逻辑末尾加
combo_level2.current(0)即可
内容的提问来源于stack exchange,提问作者David Shaw
相关产品推荐
相关产品推荐

