我正在编写一个拖放应用程序,其中我将数据从树视图拖到输入小部件。我希望能够在按下鼠标按钮时使用光标下方的树中的项目。
我知道如何获取所选项目,但在事件发生时该项目并未返回
有没有什么办法可以退货?
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)
。虽然这不是完全替换,因为该identify_row()
方法始终只返回一个元素,而该selection()
方法可以返回多个元素。