我要做的是动态更改(通过过滤器)字符串列表。在我的例子中,它是包含存储在gtk.TreeStore
。
预期效果的示例(例如,Sublime Text 2文件搜索 Ctrl + P ):
数据:
文件列表(树视图):
操作:在过滤器字段(Entry小部件)中,用户开始键入。在第一个字符后例如。 '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
,我可以将默认匹配函数更改为我自己的。问题是如何在过滤器表单字段中键入时更改列表?
答案 0 :(得分:2)
您必须阅读gtk.TreeModelFilter。在这里你可以阅读一个非常有用的例子。它是C#,但很容易将它“翻译”为python:
http://www.mono-project.com/GtkSharp_TreeView_Tutorial#Filtering_Data
答案 1 :(得分:1)
感谢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()