2012-12-28 10 views
5

Co próbuję zrobić, to dynamicznie zmieniać (przez filtr) listę ciągów. W moim przypadku jest to lista plików ze ścieżkami zapisanymi w gtk.TreeStore.PyGtk Jak zmienić dane TreeView za pomocą filtra?

Przykład oczekiwanego efektu (Np. Szukając Sublime Text 2 plik Ctrl + P):

danych:

Lista plików (TreeView):

  • „/ home/user/'
    • ' .bashrc ',
    • 'test.txt'
  • ...

Działanie: W polu filtra (widget Entry) użytkownik rozpoczyna wpisywanie. Po pierwszym znaku np. lista 't' powinna być aktualizowana tak:

Wynik:

Lista plików (katalogów):

  • 'test.txt',
  • ... wszystkie ciągi zawierające „t "(dopasowanie funkcja nie jest ważne teraz)

Co mam już:

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() 

Wiem, że TreeView ma metodę set_search_equal_func, w której mogę zmienić domyślną funkcję dopasowywania na własną. Problem polega na tym, w jaki sposób mogę zmienić listę podczas pisania w polu formularza filtru?

Odpowiedz

1

Dzięki za że C# przykład odwołuje było bardzo użyteczne. Kluczem jest użycie metod gtk.TreeModelFilter metod i refilter.

Kod wygląda to teraz:

Gdzieś w głównej klasy app:

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() 

Zmodyfikowany kod:

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() 
+0

+1, to jest naprawdę pomocne. dziękuję! – Sardathrion

Powiązane problemy