Tkinter Treeview左键单击绑定顺序问题:自定义绑定早于默认绑定致焦点滞后
解决Treeview自定义绑定获取选中行滞后的问题
你的问题核心是自定义绑定的执行顺序在Treeview默认选中逻辑之前,导致focus()返回的是上一次的结果。这里有几个实用的解决办法:
改用按钮释放事件绑定
把绑定的Button-1换成<ButtonRelease-1>,因为按钮释放时Treeview的默认选中逻辑已经执行完毕,此时调用trview.focus()就能拿到当前点击的行。注意不要给函数加括号(你原来的function_call()是直接执行函数,应该传函数对象):
trview.bind('<ButtonRelease-1>', function_call, add='+')
用after_idle延迟执行自定义逻辑
如果必须使用Button-1事件,可以在自定义函数里通过after_idle让代码在tkinter处理完所有待处理事件(包括默认绑定)后再执行:
def function_call(event): def handle_current_row(): current_item = trview.focus() # 在这里写处理当前选中行的逻辑 trview.after_idle(handle_current_row) trview.bind('Button-1', function_call, add='+')
直接从事件坐标获取点击的行
不依赖focus(),而是通过事件对象的坐标直接定位点击的行,这种方式最直接,也不会受绑定顺序影响:
def function_call(event): current_item = trview.identify_row(event.y) if current_item: # 这里处理当前行的逻辑,也可以手动设置focus:trview.focus(current_item) pass trview.bind('Button-1', function_call, add='+')
内容的提问来源于stack exchange,提问作者Nitram
相关产品推荐
相关产品推荐

