Tkinter - Выбор элемента в древовидной структуре с помощью одного щелчка вместо двойного - PullRequest
0 голосов
/ 24 апреля 2020

Когда вы хотите выбрать элемент в древовидном меню, вы обычно используете двойной щелчок:

def print_element(event):
    print(my_treeview.selection()[0])
my_treeview.bind("<Double-1>", print_element)

Сегодня я пытался сделать то же самое, но вместо этого использовал один щелчок:

my_treeview.bind("<Button-1>", print_element)

Но это не сработает. Выход был просто пустой кортеж. Я начал искать в Интернете объяснения ... почему это не работает?

РЕДАКТИРОВАТЬ: Моя цель была на самом деле do something каждый раз, когда был выбран элемент дерева.

  • Я сам предложил решение, используя функцию identify() Tkinter
  • Другой пользователь предложил использовать обратный вызов Tkinter <ButtonRelease-1>, который гораздо более уместен
  • Наконец, третий пользователь сосредоточил свой ответ на использовании обратного вызова Tkinter <<TreeviewSelect>>, который, безусловно, является лучшим вариантом

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

Это потому, что выбор еще не установлен, когда вызывается обратный вызов события <Button-1> (то же самое, что и <ButtonPress-1>, т.е. когда кнопка мыши 1 нажата и не отпущена ).

Вы должны связать <ButtonRelease-1> или <<TreeviewSelect>> вместо этого, поскольку выбор устанавливается при выполнении обратного вызова события.

1 голос
/ 25 апреля 2020

Причина, по которой это не работает так, как вы ожидаете, заключается в том, что ваша пользовательская привязка одним щелчком происходит до поведения по умолчанию. Таким образом, когда ваш один клик обрабатывается, это происходит до того, как выбран элемент. При втором нажатии ваша функция напечатает ранее выбранный элемент.

Если вы хотите, чтобы функция вызывалась при выборе элемента, вам следует привязать к <<TreeviewSelect>>, который сработает сразу после того, как пользователь выберет элемент одним щелчком мыши или с помощью клавиатуры.

Поведение дерева по умолчанию поддерживает выбор нескольких элементов одновременно, поэтому следующий код распечатает текст всех выбранных элементов в виде списка, даже если выбран только один элемент. Конечно, вы можете изменить это, чтобы распечатать только первый выбранный элемент, если вы этого хотите.

def print_element(event):
    tree = event.widget
    selection = [tree.item(item)["text"] for item in tree.selection()]
    print("selected items:", selection)

tree.bind("<<TreeviewSelect>>", print_element)
0 голосов
/ 24 апреля 2020

Почему это не работает

Когда вы щелкаете по элементу в древовидном меню, этот элемент все еще не находится в состоянии ВЫБРАННЫЙ в момент активации обратного вызова. В этот момент вы меняете статус.

При двойном щелчке первый щелчок меняет статус, а при втором щелчке активируется обратный вызов, поэтому статус уже изменился.

Как это может работать

Слава этому сайту

Короче,

def print_element(event):
    print(my_treeview.identify('item', e.x, e.y))
my_treeview.bind("<Button-1>", print_element)

На этот раз print_element() проверит координаты мыши, и обнаружит выбранный элемент, проверит, что находится под мышью. Красиво и чисто!

...