我正在编写一个拖放应用程序,将数据从树视图拖到条目小部件。我希望能够在按下鼠标按钮时使用光标下方树中的项目。
我可以看到如何获取所选项目,但在事件发生时并未返回
有什么办法可以退货吗?
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()
问题是您的绑定在
treeview
更新之前被调用。 treeview
类绑定发生在小部件特定的绑定之后,因此 selection()
函数将返回之前选择的项目。解决此问题的一种方法是在类绑定之后创建绑定(有关更多信息,请参阅此处)。
您还可以绑定到
"<<TreeviewSelect>>"
而不是 "<ButtonPress-1>"
,但它不仅可以通过鼠标按钮触发(例如,通过“向上”或“向下”键)。
第三种方法是使用几乎可以独立于
treeview
类绑定工作的函数。例如,您可以使用 identify_row
方法获取某个 Y 位置的项目。在您的情况下,只需将 selected_items = widget.selection()
替换为 selected_items = widget.identify_row(event.y)
。