【问题标题】:Remove tag from item Ttk Treeview从项目 Ttk Treeview 中删除标签
【发布时间】:2015-09-05 14:09:24
【问题描述】:

我想在我的 Ttk Treeview 中为所选项目设置不同的背景,我有这个。

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

【问题讨论】:

    标签: python select tags treeview


    【解决方案1】:

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

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

    将一些项目放入树视图中

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

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

    【讨论】:

    • 您能解释一下您的代码吗?这样,它将帮助其他人了解它的工作原理。
    • 当然,添加了一些解释。
    【解决方案2】:

    更强大的解决方案(如果您的应用程序允许一次选择多个项目)可能是使用.tag_has 方法让“TableItemClick”事件处理程序首先查找带有“已选择”标签的所有项目.然后从中删除标签,并将标签仅应用于当前选择的内容。使用这种方法,您也不需要存储先前的选择或使用额外的“未选择”标签。

    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.Treeview的新widget类,然后添加这些方法进行非破坏性添加或删除标签:

        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 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多