PyGTK如何在TreeView中“按需加载”数据

3 投票
2 回答
1546 浏览
提问于 2025-04-16 12:44

我正在使用PyGTK的TreeView(作为列表)来处理我的数据。请问有没有办法在需要的时候,通过浏览列表来加载更多数据呢?

举个例子

我有一个数据库表,里面有20万条记录。应用程序启动时,只加载200条记录到表格中。当我向下滚动时,就会再加载更多数据到TreeView里。

2 个回答

0

这是我实现树形视图按需加载的方法(列表)。我的 Gtk.TreeView 是 Gtk.ScrolledWindow 的一个子组件(所有东西都是用 Glade 构建的,但这不是重点)。

我按照 Serge 的说法设置了我的树形视图渲染:

cell = gtk.CellRendererText()
col = gtk.TreeViewColumn("Column header text")
col.pack_start(cell, True)
col.set_attributes(cell,text=0)
col.set_cell_data_func(cell, self._loadDataTest, treeView)
treeView.append_column(col)

处理的函数:

def _loadDataTest(self, column, cell, model, iter, widget):
    pageSize = widget.get_parent().get_vadjustment().get_page_size()+20
    adjGap = widget.get_parent().get_vadjustment().get_upper() - widget.get_parent().get_vadjustment().get_value()
    if widget.is_focus() and model.get_path(iter)[0] >= len(model)-2 and adjGap < pageSize:
        for i  in range(0, 20): #simulate additional data
            model.append(["row%s"%len(model)-1])
        time.sleep(0.05) #to pause execution for a while, no need to add data fow times

现在,当“倒数第二”行可见并且滚动条几乎到达底部时,就会加载新数据。在我的情况下,使用 sleep 来暂停,以便 gtk.widgets 刷新。

这个功能可以通过键盘导航、鼠标拖动滚动条或点击滚动条按钮来使用 scrollbar button。希望这能帮助到某些人。

3

我觉得你可以这样做:

  1. 在你的模型中添加空行,我想你应该使用 GtkListStore

  2. 为树视图的单元格渲染器定义一个 数据函数

  3. 在数据函数中检查当前模型的行是否已加载,如果没有,就从SQL中加载。我想你可以在这里使用缓存,一次加载多行。

下面是如何设置数据函数的一个例子:

cell = gtk.CellRendererText()        
column = gtk.TreeViewColumn('column0', cell, text=0)   
column.set_cell_data_func(cell, self.load_data)
self.list.append_column(column)

....

def load_data(self, column, cell, model, iter):
    # load data for the given model row
    print 'load data ' + model.get_value(iter, 0)

希望这能帮到你,祝好。

撰写回答