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

2023-11-24

我有一个简单的脚本,使用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)


这就是 Tkinter 的设计工作方式。小部件上的绑定先于小部件类上的绑定进行处理。它是设置所选项目的小部件类上的绑定。这使得覆盖默认绑定变得非常容易,但代价是增加默认绑定变得稍微困难​​。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐