2012-12-28 33 views
5

Những gì tôi đang cố gắng làm là thay đổi động (thông qua bộ lọc) danh sách các chuỗi. Trong trường hợp của tôi, đó là danh sách các tệp có đường dẫn được lưu trữ trong gtk.TreeStore.PyGtk Làm cách nào để thay đổi dữ liệu TreeView bằng bộ lọc?

Ví dụ về hiệu quả dự kiến ​​(. Ví dụ như Sublime file văn bản 2 tìm kiếm Ctrl + P):

dữ liệu:

Danh sách các tập tin (treeview):

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

Hành động: Trong lĩnh vực lọc (Entry widget) dùng bắt đầu gõ. Sau ký tự đầu tiên, ví dụ. danh sách 't' cần được cập nhật như thế này:

Kết quả:

Danh sách các tập tin (treeview):

  • 'test.txt',
  • ... tất cả các chuỗi có chứa 't (phù hợp với chức năng là không quan trọng bây giờ)

Những gì tôi đã có:

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

Tôi biết rằng TreeView có phương thức set_search_equal_func nơi tôi có thể thay đổi chức năng đối sánh mặc định thành của riêng mình. Vấn đề là làm thế nào tôi có thể thay đổi danh sách trong khi gõ vào trường biểu mẫu bộ lọc?

Trả lời

1

Nhờ đó C# ví dụ liên kết nó là rất hữu ích. Điều quan trọng là sử dụng các phương thức gtk.TreeModelFilterset_visible_funcrefilter.

Mã trông giống như rằng bây giờ:

Một nơi nào đó trong lớp ứng dụng chính:

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

đang Modified:

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, đây là thực sự hữu ích. dziękuję! – Sardathrion

Các vấn đề liên quan