提问人:Kingsley 提问时间:10/4/2021 最后编辑:Kingsley 更新时间:10/6/2021 访问量:198
Python GTK3 - 搜索后以编程方式在 TreeView 中选择节点?
Python GTK3 - Programtically selecting a node in TreeView after search?
问:
我有一个类函数,它通过搜索子节点进行迭代。如果找到匹配的节点,我想将选择更改为该节点。我的函数返回一个迭代器。我怀疑这是问题的根本原因,但我不确定还有什么可以返回的。所有函数似乎都想要一个.Gtk.TreeStore
Gtk.TreeSelection
Gtk.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 )
答:
1赞
Kingsley
10/5/2021
#1
好的,我已经解决了。
首先,您需要使用迭代器在 TreeView 中找到所需的项。(执行此操作的代码包含在问题中)。
找到所需的 Tree 节点后,您将得到一个“指向”最终节点的迭代器。要在树中突出显示这一点,需要执行两个步骤:
- 展开目标所在的整个分支。
- 更改所选内容以包含该项目
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
我们应该释放吗?path
path.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
评论