PyGTK, как «загрузить данные по требованию» в TreeView - PullRequest
2 голосов
/ 01 марта 2011

Я использую PyGTK TreeView (как список) для своих данных.Есть ли способ загрузить больше данных по запросу , пройдя по списку.

Например :

Iесть таблица базы данных, где 200 000 записей.При запуске приложения загружает 200 записей из таблицы.когда я прокручиваю, загружаю больше данных в treeView.

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

Полагаю, вы могли бы сделать следующее:

  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)

надеюсь, это поможет, с уважением

0 голосов
/ 03 марта 2011

Вот как мне удалось добиться загрузки по требованию для дерева (список). Мой Gtk.TreeView является дочерним по отношению к Gtk.ScrolledWindow (все построено с полянами, но это не важно)

Я настроил рендеринг в виде дерева, когда Серж сказал :

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

Теперь новые данные загружаются, когда "до последнего"(вторая снизу) строка видна, а полоса прокрутки почти внизу.В моем случае, сон используется для паузы, пока обновляются gtk.widgets.

Работает с помощью навигации по клавиатуре, перетаскиванием мыши по scrollBar или щелчком мыши по кнопке полосы прокрутки scrollbar button Надеюсь, это кому-нибудь поможет

...