如何解决两个Combobox绑定同一主下拉框选择事件的冲突问题?
问题原因
- Tkinter的
bind()方法默认对同一事件的重复绑定会采用覆盖逻辑,后绑定的回调会替换掉之前绑定的回调,所以你两次绑定<<ComboboxSelected>>事件后,仅有最后一个绑定的回调会被触发。 - 另外你代码里还有一处笔误:
combo_monuments更新函数中,给下拉框赋值的属性写的是value,正确属性应该是复数形式的values,就算绑定逻辑正常,这个笔误也会导致古迹下拉框无法更新。
解决方案
这里提供两种可直接落地的方案:
方案1:追加绑定回调
在第二个绑定操作中添加add='+'参数,告知Tkinter将该回调追加到事件的回调队列中,而非覆盖已有回调:
combo_nation.bind('<<ComboboxSelected>>', combo_city) # add='+'表示追加回调,不覆盖之前的绑定 combo_nation.bind('<<ComboboxSelected>>', combo_monuments, add='+')
同时修正combo_monuments函数里的笔误:
def combo_monuments(event=None): cursor.execute('ok, sql correct, needless to write it') result=[row[0] for row in cursor] # 把value改成values combo_monuments['values'] = result combo_monuments.current(0) return result
方案2:统一封装事件处理(更推荐,易维护)
把两个下拉框的更新逻辑封装到同一个事件处理函数中,仅绑定这一个函数即可,后续如果需要新增其他联动逻辑直接在这个函数里添加即可:
# 新增统一的国家选中事件处理函数 def on_nation_selected(event=None): combo_city(event) combo_monuments(event) # 删除原来的两次绑定,只绑定这一个即可 combo_nation.bind('<<ComboboxSelected>>', on_nation_selected)
同样需要修正上述提到的values属性笔误。
内容的提问来源于stack exchange,提问作者William50694
相关产品推荐
相关产品推荐

