Python GTK3 - 搜索后以编程方式在 TreeView 中选择节点?

Python GTK3 - Programtically selecting a node in TreeView after search?

提问人:Kingsley 提问时间:10/4/2021 最后编辑:Kingsley 更新时间:10/6/2021 访问量:198

问:

我有一个类函数,它通过搜索子节点进行迭代。如果找到匹配的节点,我想将选择更改为该节点。我的函数返回一个迭代器。我怀疑这是问题的根本原因,但我不确定还有什么可以返回的。所有函数似乎都想要一个.Gtk.TreeStoreGtk.TreeSelectionGtk.TreePath

有没有一种规范的方法在 TreeStore 中查找节点,然后选择它?这似乎是一个常见的用例,但我似乎找不到解释。

def findNodeByDescription( self, desc ):
    root_iterator = self.tree_store.get_iter_first()
    return self.findNodeByDescriptionRecursive( root_iterator, desc )

def findNodeByDescriptionRecursive( self, tree_iter, desc ):
    """ Recursive function to search the tree """
    result = None
    tree_model = self.tree_view.get_model()
    while ( result == None and tree_iter != None ):
        # is it this node?
        if ( tree_model.get_value(tree_iter, 0).description == desc ):
            # found it
            result = tree_iter 
            break
        elif ( self.tree_store.iter_has_child( tree_iter ) ):
            child_iter = self.tree_store.iter_children( tree_iter )
            result = self.findNodeByDescriptionWorker( child_iter, desc )
        tree_iter = self.tree_store.iter_next( tree_iter )
    return result

(注意:我正在使用自定义树节点)

它被称为:

编辑:我从Python GTK常见问题解答中找到了函数中的部分答案。get_path()

EDIT2:使用扩展树节点。我认为以前它是扩展子节点,而不是父节点。所以它被扩大了,但仍然看不见。(我有 3 个深的分支,并找到“中间”分支)。expand_to_path()

def findAndSelectNode( self, text ):
    tree_iter = self.findNodeByDescription( text )
    if ( tree_iter != None ):
        print("###### SELECTING ROW" )
        # THIS EXECUTES, BUT NOTHING HAPPENS?!
        path = self.tree_store.get_path( tree_iter )
        #self.tree_view.expand_row( path, True )  -- doesn't work
        self.tree_view.expand_to_path( path )
        self.tree_view.set_cursor( path )
python-3.x gtk3 gtktree 视图

评论


答:

1赞 Kingsley 10/5/2021 #1

好的,我已经解决了。

首先,您需要使用迭代器在 TreeView 中找到所需的项。(执行此操作的代码包含在问题中)。

找到所需的 Tree 节点后,您将得到一个“指向”最终节点的迭代器。要在树中突出显示这一点,需要执行两个步骤:

  1. 展开目标所在的整个分支。
  2. 更改所选内容以包含该项目
    def findSelectNode( self, text ):
        # BUG: Only by name for now.
        tree_iter = self.findNodeByDescription( text )
        if ( tree_iter != None ):
            print("###### SELECTING ROW" )
            path = self.tree_store.get_path( tree_iter )
            self.tree_view.expand_to_path( path )               # expand the whole branch
            self.tree_view.get_selection().select_path( path )  # select it

此答案假定您只需要一个选择。

评论

0赞 warem 9/24/2023
我们应该释放吗?pathpath.free()
0赞 Kingsley 9/25/2023
@warem - 当然C++,但这是 Python。它将被自动处理。C++ 参考: docs.gtk.org/gtk3/vfunc.TreeModel.get_path.html
0赞 warem 9/25/2023
你是对的。我 https://lazka.github.io/pgi-docs/Gtk-3.0/classes/TreeModel.html#Gtk.TreeModel.get_path 释放了这条路。我得到了.如果我没有释放路径,那也没关系。文档听起来不正确(可能是从 GTK+ 复制的)。segment fault