1

PyGTK ツリー ビュー (リスト ストアに結合) の選択行を選択不可にし、可能であればグレー表示にしたいと考えています。

これを行う方法はありますか?

4

2 に答える 2

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()
于 2014-11-05T11:19:25.203 に答える
3

これは少しハックな最小限のコードですが、中央の行 ('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()
于 2012-10-08T20:52:43.083 に答える