PyGTK ツリー ビュー (リスト ストアに結合) の選択行を選択不可にし、可能であればグレー表示にしたいと考えています。
これを行う方法はありますか?
これを行う正しい方法は、を使用すること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()
これは少しハックな最小限のコードですが、中央の行 ('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()