在python中用子节点迭代GTK3树



im试图在GTK3树存储中搜索字符串。树存储有4列,用于具有可调用节点的树视图小部件。im使用以下功能创建节点:

def AddItem(self,ParentIter,txt,datapath='',projName=Project):         
self.store = self.builder.get_object('theTreeStore')
NodeId = secrets.token_hex(8) 
if ParentIter == None:
ParentNodeId = ''
else:
ParentNodeId = self.store.get_value(ParentIter, 2) 
treeEntry = ['%s' %ParentNodeId,'%s' %txt,'%s' %NodeId,'%s' %datapath] 
node = self.store.append(ParentIter, treeEntry) <<<<<<<<<<<<<
self.view = self.builder.get_object('Tree')
self.view.set_model(self.store)
# table nodes(tParentNodeID ,tNodeTxt ,tNodeID ,tDataPath );

sql = "INSERT INTO %s (tParentNodeID ,tNodeTxt ,tNodeID ,tDataPath ) VALUES ('%s','%s','%s','%s')" %(projName,ParentNodeId,txt,NodeId,datapath)
self.cursor.execute(sql)
self.mariadb_connection.commit()
for x in self.cursor:
print(x)
return(node)

正如您所看到的,树中的数据嵌套在其父级中。

现在,我需要以某种方式在树存储中搜索包含某个NodeId字符串的行。我反复阅读了gtk文档,但我不太清楚该怎么办。我想我需要使用以下方法:

store.get_iter((store.iter_children((

但是idk我尝试的所有操作都只返回根节点,没有子节点。

我基本上想要一个搜索函数,它将递归地搜索每个节点及其子节点,以及它们的子节点以查找字符串。像这样的东西:

def GetRowbyNodeID(nodeid):
for row in treestore:
if row[1]==nodeid:
return(row) 
for children in row:        
if children[1] == nodeid    
return(children)

代码在多个文件中,如果需要,我可以发布任何相关的函数。

GtkTreeStore实现GtkTreeModel接口。因此,您可以使用以下方法:

  • iter=store.get_iter((以获取迭代器
  • chld_iter=iter.get_children((以获得子元素上的迭代器(请注意,这是iter的方法!(

我还建议阅读本教程。"模型"部分包含迭代模型所需的所有内容(剧透:搜索print_tree_store(

一切正常。再次感谢。我发布了相关代码,以防其他人使用。

def SearchTreeRows(self,store, treeiter, searchstr):
print("nsearch>%s"%searchstr)
while treeiter != None:
if store[treeiter][2] ==searchstr:
print("found in:%s"%str(store[treeiter][:]))
return(treeiter)
break
print("searched:%s"%str(store[treeiter][:]))    
if store.iter_has_child(treeiter):
childiter = store.iter_children(treeiter)
ret = self.SearchTreeRows(store, childiter, searchstr)
if ret is not None:
return ret
treeiter = store.iter_next(treeiter)
def NodeId2Tree(self,nodeid):
self.store = self.builder.get_object('theTreeStore')
rootiter = self.store.get_iter_first()
row = self.SearchTreeRows(self.store, rootiter,nodeid)
return(row)
def LoadProject(self):
global Project
global ProjSel
sql = "SHOW TABLES"
self.cursor.execute(sql)
tbls = []
for x in self.cursor:
tbls.append(x)   
diag = self.builder.get_object('ProjectChooser')

self.combo = Gtk.ComboBox()
ls =Gtk.ListStore(str)
for tble in tbls:
strg ="%s" %tble
ls.append(tble)
self.combo.set_model(ls)
cellr = Gtk.CellRendererText()
self.combo.pack_start(cellr,True) 
self.combo.add_attribute(cellr, 'text', 0) 
diag.vbox.pack_start(self.combo, True, True, 5)
diag.show_all()
response = diag.run()
self.combo.destroy()
print(ProjSel) 
Project = ProjSel
ProjSel = ''
view = self.builder.get_object('Tree')
self.store.clear()
view.set_model(self.store)
sql = "SELECT tParentNodeId,tNodeTxt,tNodeId FROM %s"%(Project)
self.cursor.execute(sql)

for x in self.cursor:
parid = x[0]
nodtxt = x[1]
nodid =x[2]
if parid == '':
treeEntry = ['%s' %parid,  '%s' %nodtxt,  '%s' %nodid,  '']
node = self.store.append(None, treeEntry)                #root nodes
else:
treeEntry = ['%s' %parid,  '%s' %nodtxt,  '%s' %nodid,  '']
n2id = self.NodeId2Tree(parid)
node = self.store.append(n2id, treeEntry)
print("got return:%s   For:%s"%(n2id,treeEntry[0]))

view.set_model(self.store)
#select * where parentid == none  >> get root nodes ???? or parse line by line

最新更新