PyGtk Как изменить данные TreeView, используя фильтр?
Я пытаюсь динамически изменять (через фильтр) список строк. В моем случае это список файлов с путями, которые хранятся в gtk.TreeStore
,
Пример ожидаемого эффекта (например, поиск файла Sublime Text 2 с помощью Ctrl+P):
Данные:
Список файлов (в виде дерева):
- '/ Дом / пользователь /'
- '.Bashrc',
- 'Test.txt',
- ...
Действие: В поле фильтра (виджет ввода) пользователь начинает печатать. После первого символа, например. Список 't' должен быть обновлен следующим образом:
Результат:
Список файлов (в виде дерева):
- 'Test.txt',
- ... все строки, содержащие 't' (функция соответствия сейчас не важна)
Что у меня уже есть:
self.search_entry = gtk.Entry()
self.tree_store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_BOOLEAN)
for node, files in self.files_list:
parent = self.tree_store.append(None, [node, True])
for f in files:
self.tree_store.append(parent, [f, True])
tree_filter = self.tree_store.filter_new()
self.treeview = gtk.TreeView(tree_filter)
self.renderer0 = gtk.CellRendererText()
self.treeview.insert_column_with_attributes(-1, "Filename", self.renderer0, text=0)
self.treeview.set_search_column(0)
self.treeview.set_search_entry(self.search_entry)
self.treeview.expand_all()
Я знаю, что TreeView имеет метод set_search_equal_func
где я могу изменить функцию сопоставления по умолчанию на свою собственную. Проблема в том, как я могу изменить список во время ввода в поле формы фильтра?
2 ответа
Вы должны прочитать о gtk.TreeModelFilter. Здесь вы можете прочитать очень полезный пример. Это C#, но его очень легко "перевести" на python:
Спасибо за ссылку на пример C#, это было очень полезно. Ключ должен использовать gtk.TreeModelFilter
методы set_visible_func
а также refilter
,
Теперь код выглядит так:
Где-то в основном классе приложения:
def match_func(self, model, iterr, data=None):
query = self.search_entry.get_buffer().get_text()
value = model.get_value(iterr, 0)
if query == "":
return True
elif query in value.lower():
return True
return False
def on_entry_refilter(self, widget, data=None):
self.tree_filter.refilter()
Модифицированный код:
self.search_entry = gtk.Entry()
self.search_entry.connect('changed', self.on_entry_refilter)
self.tree_store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_BOOLEAN)
for node, files in self.files_list:
parent = self.tree_store.append(None, [node, True])
for f in files:
self.tree_store.append(parent, [f, True])
self.tree_filter = self.tree_store.filter_new()
self.tree_filter.set_visible_func(self.match_func)
self.treeview = gtk.TreeView(self.tree_filter)
self.renderer0 = gtk.CellRendererText()
self.treeview.insert_column_with_attributes(-1, "Filename", self.renderer0, text=0)
self.treeview.set_search_column(0)
self.treeview.set_search_entry(self.search_entry)
self.treeview.expand_all()