2

我有一个 TreeView 和一个包含该树中 ModelIndexes 的数组。树视图的selectionMode设置为 Controls.SelectionMode.ExtendedSelection.

有没有办法根据数组中的索引突出显示树中的所有行?

我已经可以使用只选择一行

myTreeView.selection.setCurrentIndex(myindex, ItemSelectionModel.ClearAndSelect)

但我找不到选择/突出显示多行的方法?

4

2 回答 2

2

我找到了解决方案。我不确定这是否是最好的方法,但我会在这里发布,以防有​​人也在寻找这样的东西。

    myTreeView.selection.clear()

    for(var j = 0; j < selectedindex.length; j++)
   {
       myTreeView.selection.setCurrentIndex(selectedindex[j], ItemSelectionModel.Select)
   }

所以重点是Select用作ItemSelectionModel,而不是ClearAndSelect

于 2016-09-22T08:34:28.327 回答
-1
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()
于 2021-11-19T19:49:02.070 回答