每次单击单独切换 TreeView 行选择
Toggle TreeView row selection individually with each click
我正在使用由 ListStore 支持的 PyGTK 2.0 的 TreeView 创建 table 个 select 可用项目。我需要通过单击行上的任意位置来 select 和 deselect 单独的行。单击一行应该只为该行切换突出显示和复选框的值。
我创建了具有多个 selection 和一列复选框的 TreeView,但我无法在不按住 Control 的情况下切换单个行上的 selection。我尝试将 select 函数连接到视图,以便它至少可以切换复选框,但该函数不起作用 as described in the tutorial:
self.dataview = gtk.TreeView(store)
self.dataview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
self.dataview.get_selection().set_select_function(self.on_row_selected, None)
def on_row_selected(self, selection, model, path, is_selected, data):
print selection
print model
print path
print is_selected
print data
model.set_value(path, 0, is_selected)
触发select函数产生错误:
TypeError: on_row_selected() takes exactly 6 arguments (3 given)
将函数参数替换为 *args
表明仅提供了 path
和 data
。
除了 set_select_function
的行为之外,通过单击切换行 selection 的最佳方法是什么?如何将其与数据模型中的列同步?
这不是我想要的,但我终于使用 gtk.TreeViewColumn.set_cell_data_func
获得了我想要的交互。这允许我指定一个函数,每当要呈现单元格时都会调用该函数。我用它根据其数据在整行中应用自定义样式,然后使用单选点击来切换值。
self.view = gtk.TreeView(store)
self.view.get_selection().set_mode(gtk.SELECTION_SINGLE)
self.view.get_selection().set_select_function(self.on_row_selected)
...
renderer = gtk.CellRendererText()
for idx, heading in enumerate(heading_list):
col = gtk.TreeViewColumn(None, renderer, text=idx)
col.set_cell_data_func(renderer, self.cell_data_func)
...
def cell_data_func(self, column, cell, model, it):
if model.get(it, self.select_index)[0]:
# apply selected style
else:
# apply normal style
def on_row_selected(self, data):
path = data[0]
iter = self.model.get_iter(path)
val = self.model.get_value(iter, self.select_index)
self.model.set_value(iter, self.select_index, not val)
我正在使用由 ListStore 支持的 PyGTK 2.0 的 TreeView 创建 table 个 select 可用项目。我需要通过单击行上的任意位置来 select 和 deselect 单独的行。单击一行应该只为该行切换突出显示和复选框的值。
我创建了具有多个 selection 和一列复选框的 TreeView,但我无法在不按住 Control 的情况下切换单个行上的 selection。我尝试将 select 函数连接到视图,以便它至少可以切换复选框,但该函数不起作用 as described in the tutorial:
self.dataview = gtk.TreeView(store)
self.dataview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
self.dataview.get_selection().set_select_function(self.on_row_selected, None)
def on_row_selected(self, selection, model, path, is_selected, data):
print selection
print model
print path
print is_selected
print data
model.set_value(path, 0, is_selected)
触发select函数产生错误:
TypeError: on_row_selected() takes exactly 6 arguments (3 given)
将函数参数替换为 *args
表明仅提供了 path
和 data
。
除了 set_select_function
的行为之外,通过单击切换行 selection 的最佳方法是什么?如何将其与数据模型中的列同步?
这不是我想要的,但我终于使用 gtk.TreeViewColumn.set_cell_data_func
获得了我想要的交互。这允许我指定一个函数,每当要呈现单元格时都会调用该函数。我用它根据其数据在整行中应用自定义样式,然后使用单选点击来切换值。
self.view = gtk.TreeView(store)
self.view.get_selection().set_mode(gtk.SELECTION_SINGLE)
self.view.get_selection().set_select_function(self.on_row_selected)
...
renderer = gtk.CellRendererText()
for idx, heading in enumerate(heading_list):
col = gtk.TreeViewColumn(None, renderer, text=idx)
col.set_cell_data_func(renderer, self.cell_data_func)
...
def cell_data_func(self, column, cell, model, it):
if model.get(it, self.select_index)[0]:
# apply selected style
else:
# apply normal style
def on_row_selected(self, data):
path = data[0]
iter = self.model.get_iter(path)
val = self.model.get_value(iter, self.select_index)
self.model.set_value(iter, self.select_index, not val)