Select/Highlight 以编程方式在 TreeView 中显示多行
Select/Highlight multiple rows in TreeView programatically
我有一个 TreeView 和一个包含该树中的 ModelIndexes 的数组。树视图的 selectionMode
设置为 Controls.SelectionMode.ExtendedSelection
。
有没有办法根据数组中的索引突出显示树中的所有行?
我已经可以 select 使用
只有一行
myTreeView.selection.setCurrentIndex(myindex, ItemSelectionModel.ClearAndSelect)
但我找不到 select/highlight 多行的方法?
我找到了解决办法。我不确定这是否是最好的方法,但我会 post 在这里,以防有人也在寻找这样的东西。
myTreeView.selection.clear()
for(var j = 0; j < selectedindex.length; j++)
{
myTreeView.selection.setCurrentIndex(selectedindex[j], ItemSelectionModel.Select)
}
所以重点是使用 Select
作为 ItemSelectionModel,而不是 ClearAndSelect
!
import tkinter as tk
import tkinter.ttk as ttk
class App(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.CreateUI()
self.grid(sticky = (tk.N,tk.S,tk.W,tk.E))
parent.grid_rowconfigure(0, weight = 1)
parent.grid_columnconfigure(0, weight = 1)
def CreateUI(self):
tv = ttk.Treeview(self,yscrollcommand=sc.set,height=30)
tv['columns'] = ('Name',)
tv.heading("#0", text='Items')
tv.column("#0", anchor="w",width=75)
tv.heading('Name', text='Name')
tv.column('Name', anchor='w', width=150)
tv.grid(sticky = (tk.N,tk.S,tk.W,tk.E))
self.treeview = tv
self.treeview.bind('<Control-Enter>',self.OnClick)
def OnClick(self,event):
rows = self.treeview.get_children()
for row in rows:
self.treeview.selection_add(row)
items=[]
for i in range(100):
items.append([i,'Item %d' % i])
root=tk.Tk()
sv=tk.StringVar()
filt=tk.Entry(root,textvariable=sv)
filt.grid(row=0,column=0,sticky='nw')
sc=tk.Scrollbar(root)
sc.grid(row=1,column=1,sticky='ns')
item_list=App(root)
item_list.grid(row=1,column=0,sticky='ns')
sc.config(command=item_list.treeview.yview)
for i in range(len(items)):
item_list.treeview.insert('', 'end', iid=str(i), text=items[i][0], values=(items[i][1],))
item_list.treeview.selection_set('0')
def update_filter(*args):
global items,item_list,sv
filtr=sv.get().lower()
item_list.treeview.delete(*(item_list.treeview).get_children())
for i in range(len(items)):
if filtr in str(items[i][0]).lower() or filtr in str(items[i][1]).lower():
item_list.treeview.insert('', 'end', iid=str(i), text=items[i][0], values=(items[i][1],))
item_list.treeview.update()
item_list.update()
sv.trace('w', update_filter)
filt.focus()
root.mainloop()
我有一个 TreeView 和一个包含该树中的 ModelIndexes 的数组。树视图的 selectionMode
设置为 Controls.SelectionMode.ExtendedSelection
。
有没有办法根据数组中的索引突出显示树中的所有行?
我已经可以 select 使用
只有一行myTreeView.selection.setCurrentIndex(myindex, ItemSelectionModel.ClearAndSelect)
但我找不到 select/highlight 多行的方法?
我找到了解决办法。我不确定这是否是最好的方法,但我会 post 在这里,以防有人也在寻找这样的东西。
myTreeView.selection.clear()
for(var j = 0; j < selectedindex.length; j++)
{
myTreeView.selection.setCurrentIndex(selectedindex[j], ItemSelectionModel.Select)
}
所以重点是使用 Select
作为 ItemSelectionModel,而不是 ClearAndSelect
!
import tkinter as tk
import tkinter.ttk as ttk
class App(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.CreateUI()
self.grid(sticky = (tk.N,tk.S,tk.W,tk.E))
parent.grid_rowconfigure(0, weight = 1)
parent.grid_columnconfigure(0, weight = 1)
def CreateUI(self):
tv = ttk.Treeview(self,yscrollcommand=sc.set,height=30)
tv['columns'] = ('Name',)
tv.heading("#0", text='Items')
tv.column("#0", anchor="w",width=75)
tv.heading('Name', text='Name')
tv.column('Name', anchor='w', width=150)
tv.grid(sticky = (tk.N,tk.S,tk.W,tk.E))
self.treeview = tv
self.treeview.bind('<Control-Enter>',self.OnClick)
def OnClick(self,event):
rows = self.treeview.get_children()
for row in rows:
self.treeview.selection_add(row)
items=[]
for i in range(100):
items.append([i,'Item %d' % i])
root=tk.Tk()
sv=tk.StringVar()
filt=tk.Entry(root,textvariable=sv)
filt.grid(row=0,column=0,sticky='nw')
sc=tk.Scrollbar(root)
sc.grid(row=1,column=1,sticky='ns')
item_list=App(root)
item_list.grid(row=1,column=0,sticky='ns')
sc.config(command=item_list.treeview.yview)
for i in range(len(items)):
item_list.treeview.insert('', 'end', iid=str(i), text=items[i][0], values=(items[i][1],))
item_list.treeview.selection_set('0')
def update_filter(*args):
global items,item_list,sv
filtr=sv.get().lower()
item_list.treeview.delete(*(item_list.treeview).get_children())
for i in range(len(items)):
if filtr in str(items[i][0]).lower() or filtr in str(items[i][1]).lower():
item_list.treeview.insert('', 'end', iid=str(i), text=items[i][0], values=(items[i][1],))
item_list.treeview.update()
item_list.update()
sv.trace('w', update_filter)
filt.focus()
root.mainloop()