2012-12-28 11 views
5

जो मैं करने की कोशिश कर रहा हूं वह तारों की सूची गतिशील रूप से बदलता है (फिल्टर के माध्यम से)। मेरे मामले में यह gtk.TreeStore में संग्रहीत पथ वाले फ़ाइलों की सूची है।PyGtk फ़िल्टर का उपयोग करके TreeView डेटा को कैसे बदलें?

की उम्मीद प्रभाव का उदाहरण (। जैसे उदात्त पाठ 2 फ़ाइल खोज Ctrl + पी):

डाटा:

फ़ाइलें (treeview) की सूची:

  • '/ घर/उपयोगकर्ता/
    • '.bashrc',
    • 'test.txt',
  • ...

कार्रवाई: फिल्टर क्षेत्र में (एंट्री विजेट) उपयोगकर्ता टाइपिंग शुरू होता है। पहले चरित्र उदाहरण के बाद। 'टी' की सूची में इस तरह अद्यतन किया जाना चाहिए:

परिणाम:

फ़ाइलों की सूची (treeview):

  • 'test.txt',
  • ... सभी स्ट्रिंग्स 'टी युक्त '(मिलान समारोह अब महत्वपूर्ण नहीं है)

क्या मैं पहले से ही है:

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 है जहां मैं डिफ़ॉल्ट मिलान फ़ंक्शन को अपने आप में बदल सकता हूं। समस्या यह है कि मैं फिल्टर फॉर्म फ़ील्ड में टाइपिंग के दौरान सूची कैसे बदल सकता हूं?

उत्तर

1

धन्यवाद कि सी # उदाहरण के लिए लिंक यह बहुत उपयोगी था। कुंजी 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() 
+0

+1, यह वास्तव में उपयोगी है। dziękuję! – Sardathrion

संबंधित मुद्दे