Tkinter - 使用单击而不是双击从 Treeview 中选择一个项目(Treeview 项目选择的回调)

Tkinter - Selecting an item from a Treeview using single click instead of double click (Callback on Treeview item selection)

当您想 select 树视图中的项目时,通常使用双击:

def print_element(event):
    print(my_treeview.selection()[0])
my_treeview.bind("<Double-1>", print_element)

今天我尝试做同样的事情,但使用的是单击:

my_treeview.bind("<Button-1>", print_element)

但这行不通。输出只是一个空元组。 我开始在网上搜索解释......为什么它不起作用?

编辑: 我的目标实际上是 do something 每次树视图项被 selected。

为什么不起作用

当您单击树视图中的某个项目时,该项目在激活回调时仍未处于 SELECTED 状态。你在那一刻改变了状态。

使用双击,第一次点击改变状态,第二次点击激活回调,所以状态已经改变。

它是如何工作的

感谢this website

简而言之,

def print_element(event):
    print(my_treeview.identify('item', e.x, e.y))
my_treeview.bind("<Button-1>", print_element)

这次print_element()会检查鼠标的坐标,会发现选中的项目检查鼠标下的是什么。漂亮干净!

因为在<Button-1>(与<ButtonPress-1>相同,即鼠标1按下不松开) 调用事件回调。

您应该在 <ButtonRelease-1><<TreeviewSelect>> 上绑定,因为选择是在执行事件回调时设置的。

它无法按您预期的方式工作的原因是您的自定义单击绑定发生在默认行为之前。因此,当您的单击被处理时,这发生在一个项目被选中之前。第二次单击时,您的函数将打印先前选择的项目。

如果您希望在选择一个项目时调用一个函数,您应该绑定到 <<TreeviewSelect>>,它会在用户单击或通过键盘选择一个项目后立即触发。

树视图的默认行为支持一次选择多个项目,因此即使只选择了一个项目,以下代码也会将所有选定项目的文本打印为列表。当然,您可以根据需要将其修改为只打印第一个选定的项目。

def print_element(event):
    tree = event.widget
    selection = [tree.item(item)["text"] for item in tree.selection()]
    print("selected items:", selection)

tree.bind("<<TreeviewSelect>>", print_element)