我有一个带有自定义模型的Gtk.TreeView(继承自Gtk.TreeModel),我显示~150K行。我正在使用PyGtk,但这不应该那么重要。
GUI交互没问题,但是当激活交互式搜索时,它需要永远(每个字符约10秒)。 从我对Searching a ListStore的理解和测试,交互式搜索检查ListStore的每一行(内部存储为链表)以找到值。
由于我正在搜索已排序的列,我想进行二分搜索。
我该怎么做?我是否需要从头开始重新编程交互式搜索? TreeModelSort可以有用吗? (我不明白它的内部是如何管理的)
如果我推出自己的搜索用户界面,我不知道如何开始。 草图看起来像这样:
对于3. GtkTreeModel似乎可以随机访问行:
gtk.TreeModel对象支持一些Python Mapping协议,它允许您检索表示模型中一行的gtk.TreeModelRow对象。
是真正有效的随机访问吗?
答案 0 :(得分:0)
目前尚不清楚您是如何实施自定义gtk.TreeModel
的 - 是ListStore
,还是您自己推出的内容?即使有150K行,也不清楚搜索列表存储需要10秒钟。
可以在ListStore
上实现二进制搜索,但TreeView
实现的搜索不是二进制,它只是将列表从当前位置扫描到最后,寻找匹配。它允许自定义"equals" callback,但不能自定义搜索策略。你需要的是一个更通用的搜索功能,它接受一个键并返回树中相应的位置。
要实现对大树的有效搜索,您需要按照编辑中列出的问题的方式滚动自己的搜索UI。查看现有的实现,它没有多大工作:它可以归结为显示一个顶级gtk.WINDOW_POPUP
窗口,其中包含一个条目,其activate
信号连接到搜索的代码并定位树光标到它找到的那一行。