为什么我的ttk.Treeview单击处理程序在tree.focus上返回错误的项目?

问题描述

这是Tkinter设计的工作方式。在窗口小部件类上进行绑定之前,先处理窗口小部件上的绑定。窗口小部件类上的绑定设置了所选项目。这确实使覆盖认绑定变得非常容易,但代价是使其难于扩展认绑定。

这个站点已经问过几次了。在此站点搜索“bindtags”;绑定标签是控制事件处理顺序的机制。

对于树形视图小部件的特定情况,我建议绑定到<<TreeviewSelect>>事件,将在设置选择后对其进行处理。然后,您可以使用该tag_has方法来确定单击了哪种节点。

解决方法

我有一个使用ttk.Treeview实例的简单脚本,该实例填充了文件系统树的内容。我要在单击(叶子)项目时执行某些操作,因此我配置了一个处理程序,如下所示:

self.tree.tag_bind('#entry','<1>',self.onClick)

在该方法中,onClick我只是打印出被单击的项目,如下所示:

def onClick(self,event):
    item_id = str(self.tree.focus())
    print 'Selected item was %s' % item_id
    item = self.tree.item(item_id)
    flag = '#another_tag' in item['tags']
    print '  flag = %s' % flag

我发现这些消息使点击次数落后了一个。因此,我的第一次单击将获得一个随机值(看起来像树的根),然后第n次单击将打印出被单击的第(n-1)个项目的值。

它们的插入方式如下: tree.insert(parent_id,'end',id,text=id,tags=['#entry'])

有人知道这是Tkinter中的错误还是我做错了什么?

这似乎在Ubuntu Natty和OS X Lion上都是一个问题(使用默认的预安装版本的Python和Tkinter)