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