【问题标题】:PyGtk How to change TreeView data using filter?PyGtk 如何使用过滤器更改 TreeView 数据?
【发布时间】:2013-01-24 02:24:04
【问题描述】:

我正在尝试做的是动态更改(通过过滤器)字符串列表。就我而言,它是路径存储在gtk.TreeStore 中的文件列表。

预期效果示例(例如Sublime Text 2文件搜索Ctrl+P):

数据:

文件列表(树视图):

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

操作:在过滤器字段(条目小部件)中,用户开始输入。在第一个字符之后,例如。 't' 列表应该像这样更新:

结果:

文件列表(树视图):

  • 'test.txt',
  • ...所有包含'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 我可以将默认匹配函数更改为我自己的。问题是如何在输入过滤表单字段时更改列表?

【问题讨论】:

    标签: python filtering pygtk gtktreeview


    【解决方案1】:

    您必须阅读有关gtk.TreeModelFilter 的信息。在这里您可以阅读一个非常有用的示例。它是 C#,但很容易将其“翻译”成 python:

    http://www.mono-project.com/GtkSharp_TreeView_Tutorial#Filtering_Data

    【讨论】:

      【解决方案2】:

      感谢 C# 示例链接,它非常有用。关键是使用gtk.TreeModelFilter方法set_visible_funcrefilter

      代码现在看起来像这样:

      主应用程序类中的某处:

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

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        • 2022-08-20
        相关资源
        最近更新 更多