Почему мой обработчик кликов ttk.Treeview возвращает неправильный элемент в tree.focus()?

У меня есть простой скрипт, использующий экземпляр ttk.Treeview, который я заполняю содержимым дерева файловой системы. Я хочу выполнить определенную операцию, когда нажимаются (листовые) элементы, поэтому я настроил обработчик следующим образом:

self.tree.tag_bind('#entry', '<1>', self.onClick)

В методе onClick я просто распечатываю элемент, по которому щелкнули, например так:

def onClick(self, event):
    item_id = str(self.tree.focus())
    print 'Selected item was %s' % item_id
    item = self.tree.item(item_id)
    flag = '#another_tag' in item['tags']
    print '  flag = %s' % flag

Я обнаружил, что сообщения отстают от кликов на один. Таким образом, мой первый щелчок получает случайное значение (выглядит как корень дерева), а затем n-й щелчок выводит значения для (n-1)-го элемента, который был нажат.

Они были вставлены так: tree.insert(parent_id, 'end', id, text=id, tags=['#entry'])

Кто-нибудь знает, это ошибка в Tkinter или что-то, что я делаю неправильно?

Похоже, это проблема как в Ubuntu Natty, так и в OS X Lion (с использованием предустановленных версий Python и Tkinter по умолчанию).


person scorpiodawg    schedule 19.08.2012    source источник
comment
возможный дубликат привязка метки Python/Tkinter to StringVar отстает на один клик при обновлении   -  person Bryan Oakley    schedule 22.08.2012


Ответы (1)


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

На этом сайте несколько раз спрашивали. Выполните поиск "bindtags" на этом сайте; bindtags — это механизм, управляющий порядком обработки событий.

В конкретном случае древовидного виджета я рекомендую привязку к событию <<TreeviewSelect>>, которое будет обработано после установки выделения. Затем вы можете использовать метод tag_has, чтобы определить, какой узел был нажат.

person Bryan Oakley    schedule 21.08.2012