PyGtkフィルタを使用してTreeViewデータを変更するには?

私がしようとしているのは、動的に(フィルタを介して)文字列のリストを変更することです。私の場合、 gtk.TreeStore にパスが保存されたファイルのリストです。

期待される効果の例(例えば、サブライムテキスト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 というメソッドがあることはわかっています。問題は、フィルタフォームフィールドで入力中にリストを変更する方法です。

5
nl ru de

2 答え

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()
1
追加された
+1、これは本当に役に立ちます。 dziękuję!
追加された 著者 Sardathrion,