使GTK TreeView中的行无法选择

时间:2012-10-08 14:09:14

标签: python gtk pygtk

我想让PyGTK Tree-view(耦合到List Store)的选择行不可选,如果可能的话,显示为灰色。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:5)

执行此操作的正确方法是使用gtk.TreeSelection.set_select_function。关于如何使行变灰,可能会使渲染器对它们不敏感(请参阅下面示例中的sensitive=1)。

以下示例:

import pygtk
pygtk.require('2.0')
import gtk


def main():
    """Display treeview with one row not selectable."""
    window = gtk.Window()
    store = gtk.ListStore(str, bool)
    for row in (('A', True), ('B', False), ('C', True)):
        store.append(row)

    treeview = gtk.TreeView(store)
    renderer = gtk.CellRendererText()
    column = gtk.TreeViewColumn('Name', renderer, text=0, sensitive=1)
    treeview.append_column(column)
    window.add(treeview)

    selection = treeview.get_selection()
    selection.set_select_function(
        # Row selectable only if sensitive
        lambda path: store[path][1]
    )
    selection.set_mode(gtk.SELECTION_MULTIPLE)
    window.show_all()
    gtk.main()

if __name__ == '__main__':
    main()

答案 1 :(得分:2)

这是一个有点hackish的最小代码,但它将无法选择中间行('B')。如果您希望记住之前的选择,那么在信号回调结束时选择哪些行应该很容易,如果选择了错误的行,则覆盖当前选择。

至于各行并将它们变成灰色,我不确定......但这个例子似乎在处理它:http://coding.debuntu.org/python-gtk-treeview-rows-different-colors

import pygtk
pygtk.require('2.0')
import gtk

def clicked(selection):

    global selection_signal

    liststores, listpaths = selection.get_selected_rows()
    for selected_row in xrange(len(listpaths)):
        #The 1 looks for the 'B' row
        if listpaths[selected_row][0] == 1:
            #Blocking the handler so that the reverting doesn't invoke a callback
            selection.handler_block(selection_signal)
            selection.unselect_path(listpaths[selected_row])
            selection.handler_unblock(selection_signal)


w = gtk.Window()
treemodel = gtk.ListStore(str)
for r in ('A', 'B', 'C'):
    treemodel.append([r])

treeview = gtk.TreeView(treemodel)
w.add(treeview)
tv_cell = gtk.CellRendererText()
tv_column = gtk.TreeViewColumn("Header", tv_cell, text=0)
treeview.append_column(tv_column)
selection = treeview.get_selection()
selection_signal = selection.connect("changed", clicked)
selection.set_mode(gtk.SELECTION_MULTIPLE)
w.show_all()