GtkTreeView 过滤和选择
Posted
技术标签:
【中文标题】GtkTreeView 过滤和选择【英文标题】:GtkTreeView filtering and selecting 【发布时间】:2015-06-15 11:36:42 【问题描述】:我有一个简单的GtkTreeView
和一个GtkEntry
用于过滤模型。
当我在条目中输入一些内容时,software_list
会按语言过滤。
software_list = [("Firefox", 2002, "C++"),
("Eclipse", 2004, "Java" ),
("Netbeans", 1996, "Java"),
("Chrome", 2008, "C++"),
("GCC", 1987, "C"),
("Frostwire", 2004, "Java")]
class TreeViewFilterWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.curr_filter = ''
self.entry = Gtk.Entry()
self.entry.connect('changed', self.on_text_change)
self.software_liststore = Gtk.ListStore(str, int, str)
for software_ref in software_list:
self.software_liststore.append(list(software_ref))
self.filter = self.software_liststore.filter_new()
self.filter.set_visible_func(self.filter_func)
self.treeview = Gtk.TreeView.new_with_model(self.filter)
for i, column_title in enumerate(["Software", "Release Year", "Programming Language"]):
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn(column_title, renderer, text=i)
self.treeview.append_column(column)
self.treeview.get_selection().connect('changed', self.on_row_select)
# packing into boxes, showing components, starting main loop goes here
def on_text_change(self, entry):
self.curr_filter = entry.get_text()
self.filter.refilter()
def filter_func(self, model, iter, data):
if self.curr_filter:
return re.search(re.escape(self.curr_filter), model[iter][2])
else:
return True
问题是,当我从列表中选择“Chrome”,然后在条目中键入“Java”时,显然“Chrome”会被隐藏,但选择会更改为其他一些随机行。我更喜欢 TreeView 未选择的隐藏元素,而不是更改选择。我该怎么做?
【问题讨论】:
这是非常复杂的代码。你真的想在这里完成什么? “那么,显然,“Chrome”被隐藏了”对我来说并不明显。 【参考方案1】:这在 Gtk2 中按预期工作,但在 Gtk3 中,如果行消失,您需要取消选择该行。相应的代码是
class TreeViewFilterWindow(Gtk.Window):
def __init__(...):
...
self.selection = self.treeview.get_selection()
self.filter.connect('row-deleted', self.on_row_deleted)
def on_row_deleted(self, model, path):
if self.selection.path_is_selected(path):
GObject.idle_add(self.selection.unselect_path, path)
我发现由于某种原因直接调用self.selection.unselect_path(path)
似乎不起作用,但是用idle_add
推迟它就解决了。
【讨论】:
以上是关于GtkTreeView 过滤和选择的主要内容,如果未能解决你的问题,请参考以下文章