如何基于未知长度数据集创建层级化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
相关产品推荐
相关产品推荐

