问题描述
这是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)