Ttk.Treeview 预选某些行时多选失败

Ttk.Treeview multiple selection fails when some lines are preselected

我想 select 来自 ttk.Treeview 小部件的多行。下面的最小代码生成此 window:

只需单击 window 即可生成正确的结果。当调用 treeview_callback 时打印结果树 selection。

但是,<Cmd> 单击应该产生扩展的 selection 不起作用 但仅当 小部件首次显示时才起作用。虚拟事件 <<TreeviewSelect>> 未调用回调函数。 <Cmd> 以前的鼠标 selection 可以在没有 <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()

我找到的解决方法是在设置选择之前将焦点设置在第一项上:

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()