Tkinter Treeview – получить элемент под курсором на <ButtonPress-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()

Может быть, вы можете использовать selected_items = widget.identify_row(event.y)

Danya K 27.08.2024 12:34

@DanyaK Прекрасно. Хотите обработать ответ?

Psionman 27.08.2024 13:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что ваша привязка вызывается до обновления treeview. Привязки класса treeview происходят после привязок, специфичных для виджета, поэтому функция selection() вернет ранее выбранный элемент. Один из способов исправить это — создать привязку после привязок класса (дополнительную информацию см. здесь).

Также можно сделать привязку к "<<TreeviewSelect>>" вместо "<ButtonPress-1>", но она может вызываться не только кнопкой мыши (например, клавишами «Вверх» или «Вниз»)).

Третий способ — использовать функцию, которая может работать практически независимо от привязки класса treeview. Например, вы можете использовать метод identify_row, чтобы получить элемент в некоторой позиции Y. В вашем случае просто замените selected_items = widget.selection() на selected_items = widget.identify_row(event.y). Хотя это не точная замена, поскольку метод identify_row() всегда возвращает только один элемент, а метод selection() может возвращать несколько элементов.

Другие вопросы по теме