You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于未知长度数据集创建层级化Gtk.TreeStore

构建层级化Gtk.TreeStore的实现方案

一、处理数据库返回的父子键结构数据

针对你提供的父键-子键形式的数据库数据,我们可以通过数据整理+递归插入的方式构建TreeStore:

步骤1:整理数据结构

先把查询结果转换成两个字典,方便后续快速查找节点关系:

  • node_info:以ckey为键,存储节点的名称和父键
  • parent_to_children:以cparentkey为键,存储该父节点下所有子节点的ckey列表

步骤2:递归插入节点

从根节点(父键为0)开始,逐个插入TreeStore,再递归处理每个节点的子节点,适配任意层级的未知数据量。

完整代码示例

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

def build_treestore_from_db_data(db_data):
    # 整理数据结构
    node_info = {}
    parent_to_children = {}
    for ckey, ccategory, cparentkey in db_data:
        node_info[ckey] = (ccategory, cparentkey)
        if cparentkey not in parent_to_children:
            parent_to_children[cparentkey] = []
        parent_to_children[cparentkey].append(ckey)
    
    # 创建TreeStore,存储节点名称、节点ckey两个字段
    treestore = Gtk.TreeStore(str, int)
    
    # 递归插入节点的内部函数
    def insert_nodes(parent_iter, parent_key):
        if parent_key not in parent_to_children:
            return
        for child_key in parent_to_children[parent_key]:
            category, _ = node_info[child_key]
            # 插入当前节点
            child_iter = treestore.append(parent_iter, [category, child_key])
            # 递归插入子节点
            insert_nodes(child_iter, child_key)
    
    # 从根节点(parent_key=0)开始插入
    insert_nodes(None, 0)
    return treestore

# 模拟数据库查询返回的数据
db_data = [
    (1, 'Library', 0),
    (2, 'Notes', 0),
    (3, 'Parts', 0),
    (16, 'Power', 3),
    (17, 'Battery', 16),
    (18, 'PSU', 16),
    (19, 'Resistor', 3),
    (20, 'Film', 19),
    (21, 'Metal', 19),
    (22, 'Potentiometer', 19),
    (50, 'Transformer', 16),
    (51, 'Toroidal', 50),
    (52, 'EI', 51),
    (53, 'FI', 51)
]

# 构建TreeStore并绑定到TreeView展示
treestore = build_treestore_from_db_data(db_data)
treeview = Gtk.TreeView(model=treestore)

# 添加展示列
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn('Category', renderer, text=0)
treeview.append_column(column)

# 构建窗口运行
window = Gtk.Window(title='Hierarchical TreeStore')
window.add(treeview)
window.connect('destroy', Gtk.main_quit)
window.show_all()
Gtk.main()

二、处理路径列表形式的数据

如果需要处理['Power'], ['Power','Battery']这类路径列表数据,可以用字典记录每个路径对应的TreeIter,避免重复查找,提升效率:

代码示例

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

def build_treestore_from_paths(paths):
    treestore = Gtk.TreeStore(str)
    # 记录每个路径对应的迭代器,比如('Power',)对应Power节点的iter
    path_iter_map = {}
    
    for path in paths:
        current_parent = None
        current_path = ()
        for part in path:
            current_path += (part,)
            if current_path not in path_iter_map:
                # 插入新节点
                iter_ = treestore.append(current_parent, [part])
                path_iter_map[current_path] = iter_
            current_parent = path_iter_map[current_path]
    return treestore

# 模拟路径数据
paths = [
    ['Power'],['Power','Battery'],['Power','PSU'],['Power','Transformer'],
    ['Power','Transformer','Toroidal'],['Power','Transformer','Toroidal','EI'],
    ['Power','Transformer','Toroidal','FI'],['Resistor'],['Resistor','Film'],
    ['Resistor','Metal'],['Resistor','Potentiometer']
]

# 构建并展示
treestore = build_treestore_from_paths(paths)
treeview = Gtk.TreeView(model=treestore)
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn('Category', renderer, text=0)
treeview.append_column(column)

window = Gtk.Window(title='Path-based TreeStore')
window.add(treeview)
window.connect('destroy', Gtk.main_quit)
window.show_all()
Gtk.main()

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:50:17