Я пишу приложение перетаскивания, в котором перетаскиваю данные из древовидного представления в виджет ввода. Я хочу иметь возможность использовать элемент дерева, который находится под курсором при нажатии кнопки мыши.
Я вижу, как получить выбранный элемент, но он не возвращается в момент события.
Есть ли возможность вернуть товар?
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()
@DanyaK Прекрасно. Хотите обработать ответ?
Проблема в том, что ваша привязка вызывается до обновления treeview
. Привязки класса treeview
происходят после привязок, специфичных для виджета, поэтому функция selection()
вернет ранее выбранный элемент. Один из способов исправить это — создать привязку после привязок класса (дополнительную информацию см. здесь).
Также можно сделать привязку к "<<TreeviewSelect>>"
вместо "<ButtonPress-1>"
, но она может вызываться не только кнопкой мыши (например, клавишами «Вверх» или «Вниз»)).
Третий способ — использовать функцию, которая может работать практически независимо от привязки класса treeview
. Например, вы можете использовать метод identify_row
, чтобы получить элемент в некоторой позиции Y. В вашем случае просто замените selected_items = widget.selection()
на selected_items = widget.identify_row(event.y)
. Хотя это не точная замена, поскольку метод identify_row()
всегда возвращает только один элемент, а метод selection()
может возвращать несколько элементов.
Может быть, вы можете использовать
selected_items = widget.identify_row(event.y)