Итерация GTK3 Treestore с дочерними узлами в python - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь найти в дереве деревьев GTK 3 строку. Хранилище деревьев имеет 4 столбца и предназначено для виджета в виде дерева, в котором есть вызываемые узлы. я создаю узлы с помощью этой функции:

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

но все, что я пробую, возвращает только корневые узлы без дочерних элементов.

Мне в основном нужна функция поиска, которая будет рекурсивно искать строку для каждого узла и его дочерних элементов, а также их дочерних элементов. как то так:

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

Код находится в нескольких файлах, я могу публиковать любые функции, если это необходимо.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Все заработало. еще раз спасибо. я публикую соответствующий код на тот случай, если кто-то другой сможет его использовать.

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
0 голосов
/ 07 ноября 2018

GtkTreeStore реализует GtkTreeModel интерфейс. Таким образом вы можете использовать следующие методы:

Я бы также рекомендовал прочитать этот урок . Раздел «Модель» содержит все, что нужно для перебора модели (спойлер: поиск print_tree_store)

...