从项目Ttk Treeview中移除标签



我想为我的Ttk树视图中选定的项目设置不同的背景,我有这个。

self.tree.bind("<<TreeviewSelect>>", self.TableItemClick)
def TableItemClick(self, event):
    self.tree.item(self.tree.selection(), tags="selected")

但是我如何从项目中删除标签?现在所有的东西都用这个标签。我需要从所有项目中删除这个标签,并为新项目设置它。由于

编辑我解决它的方法是将前一项存储到变量中,然后给它未选择的标签

def TableItemClick(self, event):
    self.tree.item(self.selected, tags="unselected")
    self.tree.item(self.tree.selection(), tags="selected")
    self.selected = self.tree.selection()

创建一个窗口和一个树视图

app = Tk()
tree = ttk.Treeview(app)
tree.pack()

将一些项放入treeview

tree.insert('', 'end', 'toplevel', text='title')
tree.insert('toplevel', 'end', text='some text', tags='tagred')
item_id = tree.insert('toplevel', 'end', text='some text', tags='tagyellow')

将标签为'tagred'的项目配置为红色背景

tree.tag_configure('tagred', background="red")

将标签为'tagyellow'的项目配置为黄色背景

tree.tag_configure('tagyellow', background="yellow")

使用我们上面存储的id item_id来删除该项目的所有标签。

tree.item(item_id, tags=())

启动应用程序

app.mainloop()

你会注意到有一个黄色的项目,但是在树视图中它下面的项目不是红色的

一个更健壮的解决方案(如果您的应用程序允许一次选择多个项目)可以使用.tag_has方法让'TableItemClick'事件处理程序首先查找带有'selected'标记的所有项目。然后从中删除标记,并仅将标记应用于当前选择的内容。使用此方法,您也不需要存储以前的选择或使用额外的'unselected'标记。

self.tree = ttk.Treeview()
self.tree.tag_configure( 'selected', background='red' )
def TableItemClick( self, event ):
    # Remove existing selected tags
    for iid in fileTree.tag_has( 'selected' ):
        self.tree.item( iid, tags=() )
    # Add selected tag to current selection
    for iid in self.tree.selection():
        self.tree.item( iid, tags='selected' )

然而,到目前为止,这个和其他解决方案仍然存在另一个潜在的问题,即它们将删除其他现有的标签。因此,如果您的应用程序也使用其他标记,则必须进一步使用上述代码。我所做的只是从ttk继承了一个新的小部件类。树视图,然后添加这些方法来非破坏性地添加或删除标签:

    def addTag( self, iid, tagToAdd ):
        """ Adds the given tag from the given item, while preserving other tags it may have. """
        
        targetFileTags = self.item( iid, 'tags' ) # Returns a tuple
        targetFileTags = list( targetFileTags )
        targetFileTags.append( tagToAdd )
        self.item( iid, tags=targetFileTags )
    def removeTag( self, iid, tagToRemove ):
        """ Removes the given tag from the given item, while preserving other tags it may have. """
        currentTags = list( self.item( iid, 'tags' ) )
        if tagToRemove in currentTags:
            currentTags.remove( tagToRemove )
            self.item( iid, tags=currentTags )

最新更新