每次单击都会单独切换TreeView行选择

时间:2017-05-16 17:18:31

标签: python pygtk gtk2 gtktreeview

我正在使用由ListStore支持的PyGTK 2.0的TreeView来创建可选项的表。我需要通过单击行上的任意位置来选择和取消选择单个行。单击一行应该仅为该行切换突出显示和复选框的值。

我已经创建了具有多个选择的TreeView和一个用于复选框的列,但是我无法在不保持Control的情况下切换单个行上的选择。我尝试将一个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替换函数参数表明只提供pathdata

set_select_function的行为外,通过单击切换行选择的最佳方法是什么,以及如何将其与数据模型中的列同步?

1 个答案:

答案 0 :(得分:0)

这不是我要求的,但我终于通过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)