为什么我的ttk.Treeview click处理程序返回tree.focus()上的错误项?

时间:2012-08-19 02:21:21

标签: python treeview onclick tkinter ttk

我有一个使用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)

1 个答案:

答案 0 :(得分:4)

这就是Tkinter的工作方式。在窗口小部件类上绑定之前处理窗口小部件上的绑定。它是widget组中设置所选项的绑定。这使得覆盖默认绑定非常容易,但代价是增加默认绑定会稍微困难。

本网站已经多次询问过这个问题。 Search for "bindtags"在此网站上; bindtags是控制事件处理顺序的机制。

在treeview小部件的特定情况下,我建议绑定到<<TreeviewSelect>>事件,该事件将在设置选择后进行处理。然后,您可以使用tag_has方法确定单击的节点类型。