【问题标题】:Why does my ttk.Treeview click handler return the wrong item on tree.focus()?为什么我的 ttk.Treeview 点击处理程序在 tree.focus() 上返回错误的项目?
【发布时间】:2012-08-14 23:03:05
【问题描述】:

我有一个使用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 的默认预安装版本)

【问题讨论】:

标签: python treeview onclick tkinter ttk


【解决方案1】:

这就是 Tkinter 设计的工作方式。小部件上的绑定在小部件类上的绑定之前处理。设置所选项目的是小部件类上的绑定。这使得覆盖默认绑定变得非常容易,但代价是增加默认绑定变得更加困难。

这个网站已经被问过几次了。 Search for "bindtags" 在这个网站上; bindtags 是控制事件处理顺序的机制。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多