2012-12-28 12 views
5

Quello che sto cercando di fare è modificare dinamicamente (tramite filtro) un elenco di stringhe. Nel mio caso si tratta di un elenco di file con percorsi memorizzati in gtk.TreeStore.PyGtk Come modificare i dati TreeView usando il filtro?

Esempio di effetto previsto (es. Sublime Text file 2 ricerca Ctrl + P):

dati:

Elenco dei file (TreeView):

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

Azione: Nel campo del filtro (widget di Entry) utente inizia a digitare. Dopo il primo carattere es. lista 't' dovrebbe essere aggiornato in questo modo:

Risultato:

Elenco dei file (ad albero):

  • 'test.txt',
  • ... tutte le stringhe contenenti 't '(funzione di corrispondenza non è importante ora)

quello che ho già:

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

So che TreeView ha un metodo set_search_equal_func in cui posso modificare la funzione di corrispondenza predefinita per il mio. Il problema è come posso cambiare l'elenco durante la digitazione nel campo del modulo filtro?

risposta

1

Grazie per questo C# esempio collegamento è stato molto utile. La chiave è utilizzare i metodi gtk.TreeModelFilterset_visible_func e refilter.

codice sembra che ormai:

Da qualche parte in classe applicazione principale:

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

Codice modificato:

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, questo è davvero utile. Dziękuję! – Sardathrion