Многократный выбор Ttk.Treeview завершается неудачно, когда некоторые строки предварительно выбраны - PullRequest
0 голосов
/ 20 января 2020

Я хочу выбрать несколько строк из виджета ttk.Treeview. Минимальный код, который следует за этим, создает это окно:

ttk.Treeview screenshot

Простой щелчок в окне приводит к правильным результатам. Результирующее выделение дерева печатается при вызове treeview_callback.

Однако нажатие <Cmd>, которое должно привести к расширенному выделению, не работает , но только при первом отображении виджета . Функция обратного вызова не вызывается виртуальным событием <<TreeviewSelect>>. Нажатие <Cmd> может быть выполнено с помощью предварительного выбора мыши без клавиши <Cmd>.

Ошибка не является последовательной. Это происходит, когда древовидная структура отображается впервые. После нескольких нажатий <Cmd> одного цвета они начинают регистрироваться. Количество кликов варьируется, но всегда было меньше двадцати. Я не смог обнаружить какой-либо шаблон, который мог бы объяснить, когда он начинает работать. Как только он начал работать правильно, никакого возврата в режим отказа не было замечено.

"""Treeview selection error demo."""

import tkinter as tk
import tkinter.ttk as ttk


def treeview_callback(tree: ttk.Treeview):
   def print_color_selection(*args):
       print(f"{tree.selection()=}")
   return print_color_selection


gui = tk.Tk()

tree = ttk.Treeview(gui, columns=('colors',), height=6, selectmode='extended', 
                    show='tree')
tree.grid(column=0, row=0)
tree.tag_bind('colors', '<<TreeviewSelect>>', callback=treeview_callback(tree))

for color in ['blue', 'white', 'red', 'green', 'goldenrod']:
    tree.insert('', 'end', color, text=color, tags='colors')
tree.selection_add('white', 'red', 'green')

gui.mainloop()

1 Ответ

1 голос
/ 20 января 2020

Обходной путь, который я нашел, заключается в установке фокуса на первом элементе перед установкой выбора:

import tkinter as tk
import tkinter.ttk as ttk


def treeview_callback(tree: ttk.Treeview):
   def print_color_selection(*args):
       print(f"{tree.selection()}")
   return print_color_selection


gui = tk.Tk()

tree = ttk.Treeview(gui, columns=('colors',), height=6, selectmode='extended', 
                    show='tree')
tree.grid(column=0, row=0)
tree.tag_bind('colors', '<<TreeviewSelect>>', callback=treeview_callback(tree))

for color in ['blue', 'white', 'red', 'green', 'goldenrod']:
    tree.insert('', 'end', color, text=color, tags='colors')

tree.focus('blue') # <- This gives focus to the first item
tree.selection_set('white', 'red', 'green')

gui.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...