【问题标题】:user search collapsed rows in a Gtk.TreeView用户在 Gtk.TreeView 中搜索折叠的行
【发布时间】:2014-04-29 05:03:01
【问题描述】:

如何获得交互式搜索(通过按 Ctrl-f 或 / 调用的搜索)来迭代 Gtk.TreeView 的折叠行?

例如,如果我想在下面的代码中不先展开“第四行”而搜索“四中之二”:

from gi.repository import Gtk

class Main(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Recursive Search")

        self.set_default_size(200, 200)

        self.treestore = Gtk.TreeStore(str, str)

        treeiter = self.treestore.append(None, ["Row One", ""])
        self.treestore.append(treeiter, ["Row Two", "First in One"])
        self.treestore.append(treeiter, ["Row Tree", "Second in One"])

        treeiter = self.treestore.append(None, ["Row Four", ""])
        self.treestore.append(treeiter, ["Row Five", "First in Four"])
        self.treestore.append(treeiter, ["Row Six", "Second in Four"])

        treeiter = self.treestore.append(None, ["Row Seven", ""])
        self.treestore.append(treeiter, ["Row Eight", "First in Seven"])
        self.treestore.append(treeiter, ["Row Nine", "Second in Seven"])

        treeview = Gtk.TreeView(model=self.treestore)

        renderer_text = Gtk.CellRendererText()
        column_text = Gtk.TreeViewColumn(cell_renderer=renderer_text, text=0)
        treeview.append_column(column_text)
        column_text = Gtk.TreeViewColumn(cell_renderer=renderer_text, text=1)
        treeview.append_column(column_text)

        treeview.set_search_column(1)

        treeview.set_headers_visible(False)

        self.add(treeview)

win = Main()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

【问题讨论】:

    标签: python treeview gtk


    【解决方案1】:

    您可以为此使用Gtk.Treeview.set_search_equal_func()

        def __init__(self):
            ...
            treeview.set_search_equal_func(self.search_function)
            self.treeview = treeview
    
        def search_function(self, model, column, key, rowiter):
            row = model[rowiter]
            if key.lower() in list(row)[column-1].lower():
                return False # Search matches
    
            # Search in child rows.  If one of the rows matches, expand the row so that it will be open in later checks.
            for inner in row.iterchildren():
                if key.lower() in list(inner)[column-1].lower():
                    self.treeview.expand_to_path(row.path)
                    break
            else:
                 self.treeview.collapse_row(row.path)
    
            return True # Search does not match
    

    我会推荐 gnome.org 获取有关 Gtk 的文档。它没有所有的最新更新,但它提供了关于许多 Gtk 类和函数的易于阅读和查找的文档。

    【讨论】:

    • 现在不行,但我可以弄清楚如何添加它。
    • 呵呵,问题就在这里:D
    • 我已经想出了如何扩展该行,但我还没有想出如何选择正确的子行。如果没关系,我会停止寻找;但除非你告诉我不要这样做,否则我会继续努力。
    • ty,正是我需要的。
    • 非常感谢。将两个实例中的 0 更改为“column”参数以适合示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    相关资源
    最近更新 更多