Tkinter 树视图 - 获取光标下的项目 <ButtonPress-1>

问题描述 投票:0回答:1

我正在编写一个拖放应用程序,将数据从树视图拖到条目小部件。我希望能够在按下鼠标按钮时使用光标下方树中的项目。

我可以看到如何获取所选项目,但在事件发生时并未返回

有什么办法可以退货吗?

import tkinter as tk
from tkinter import ttk

def main() -> None:
    root = tk.Tk()
    root.title('Tree coords')

    tree = ttk.Treeview(root, height=30, show='headings',)
    tree.grid(row=0, column=0, sticky=tk.NSEW)
    tree.bind("<ButtonPress-1>", on_start)

    col_list = ('Names', 'Names', 30)
    tree['columns'] = col_list

    for name in ['ab', 'ef', 'mn']:
        values = (name)
        tree.insert('', 'end', values=values)

    root.mainloop()

def on_start(event=None):
    widget = event.widget
    selected_items = widget.selection()
    x, y = event.widget.winfo_pointerxy()
    print(x, y, selected_items)

if __name__ == '__main__':
    main()
tkinter drag-and-drop treeview
1个回答
0
投票

问题是您的绑定在

treeview
更新之前被调用。
treeview
类绑定发生在小部件特定的绑定之后,因此
selection()
函数将返回之前选择的项目。解决此问题的一种方法是在类绑定之后创建绑定(有关更多信息,请参阅此处)。

您还可以绑定到

"<<TreeviewSelect>>"
而不是
"<ButtonPress-1>"
,但它不仅可以通过鼠标按钮触发(例如,通过“向上”或“向下”键)。

第三种方法是使用几乎可以独立于

treeview
类绑定工作的函数。例如,您可以使用
identify_row
方法获取某个 Y 位置的项目。在您的情况下,只需将
selected_items = widget.selection()
替换为
selected_items = widget.identify_row(event.y)

© www.soinside.com 2019 - 2024. All rights reserved.