【问题标题】:Tkinter - Selecting an item from a Treeview using single click instead of double click (Callback on Treeview item selection)Tkinter - 使用单击而不是双击从树视图中选择一个项目(在树视图项目选择上回调)
【发布时间】:2020-08-07 18:48:59
【问题描述】:

当你想在 Treeview 中选择一个项目时,你通常使用双击:

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

  • 我自己使用Tkinter的identify()函数提出了一个解决方案
  • 另一位用户建议使用 Tkinter 回调 &lt;ButtonRelease-1&gt; 更合适
  • 最后,第三位用户的答案集中在使用 Tkinter 回调 &lt;&lt;TreeviewSelect&gt;&gt;,这无疑是最佳选择

【问题讨论】:

  • 这能回答你的问题吗? tkinter-treeview-click-event-for-selected-item
  • 您应该绑定&lt;ButtonRelease-1&gt;&lt;&lt;TreeviewSelect&gt;&gt;
  • @acw1668 我没想过以这种方式使用该事件。你建议的可能是pythonic的方法。如果你留下一个答案,我会接受你的
  • 您是在问如何在点击时在树形视图中选择一个项目? Treeview 会自动为您执行此操作。或者,您是否在问如何在 Treeview 中选择某些内容时运行函数?
  • @BryanOakley 我的目标是在选定项目的同一时刻从选定项目中获取特定值,而无需双击

标签: python tkinter tk ttk


【解决方案1】:

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

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

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

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)

【讨论】:

    【解决方案2】:

    这是因为在调用&lt;Button-1&gt;(与&lt;ButtonPress-1&gt;相同,即鼠标按钮1按下但未释放)事件回调时尚未设置选择.

    您应该绑定 &lt;ButtonRelease-1&gt;&lt;&lt;TreeviewSelect&gt;&gt;,而不是在执行事件回调时设置选择。

    【讨论】:

    • 我必须选择 Bryan 的答案,因为他提供了一个代码解决方案,并将他的答案集中在 TreeviewSelect 上(当你提到它时我什至没有注意它)。尽管如此,还是对提出 ButtonRelease-1 表示赞赏
    【解决方案3】:

    为什么它不起作用

    当您单击树视图中的项目时,在激活回调的那一刻,该项目仍不处于 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() 会检查鼠标的坐标,并会发现选中的项目检查鼠标下的内容。又好又干净!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多