获取复选框在GtkTreeView中切换

时间:2011-04-18 18:55:23

标签: python pygtk gtktreeview

我正在使用带有复选框的树视图。我希望用户能够单击一个复选框,它会将该项添加到收藏夹列表中。但目前我根本无法切换盒子。这是我的代码:

def draw_columns(self,treeview):
    self.ren = gtk.CellRendererToggle()
    self.ren.connect('toggled',self.on_toggle,treeview.get_model())
    self.tvfav = gtk.TreeViewColumn('Fav',self.ren,text=7)
    for i in [self.tvfav,'andall the other columns']:
        treeview.append_column(i)

 def on_toggle(self,cell,path_str,model):
    toggle_item = model.get_value(iter,column)
    toggle_item = not toggle_item
 # This method didn't work either
 ## model[path_str][1] = not model[path_str][1]
    if toggle_item:
        #Add it to the favourite list if it isn't already
        pass
    else:
        #remove it from the favourite list
        pass
    model.set(iter,column,toggle_item)   

def __init__(self):'
    ....
    self.liststore = gtk.ListStore(str,int, int, int,str, 'gboolean', str)
    self.treeview = gtk.TreeView(self.liststore)
    ....

我无法检查盒子的错误?另外,如果将项目附加到树视图,我将如何设置切换:

if name in favourites:
    #Append to list with checkbox on
    self.liststore.append([name,x,y,z,ss,True,sss])

1 个答案:

答案 0 :(得分:3)

免责声明:我相信这不是总bs,但目前无法测试。

首先,CellRendererToggle不会采用文本属性。第二,如果你仍然设置它,你不会将它设置为列索引7,因为你在liststore上只有7列(而索引7将是第8列)。

您可以在“属性”下的reference中查看可以为渲染器设置的所有可用属性(另请注意继承的属性)。现在,要为每个单独的单元格(每行)设置属性,您可以像指定的那样设置关键字参数。所以在你的TreeviewColumn中你可以设置:

# 5 is the index of bool in the liststore
gtk.TreeViewColumn('Fav',renderer,active=5)

任何像这样设置的属性都会映射到liststore中的相应条目。这意味着您可以直接在liststore上或通过回调(例如on_toggle)更改它。

编辑:

也许你必须设置mode property

编辑2:

这是一个有效的例子。

import gtk


def on_toggle(cell, path, model, *ignore):
    if path is not None:
        it = model.get_iter(path)
        model[it][0] = not model[it][0]

model = gtk.ListStore(bool)
tv = gtk.TreeView(model)

cell = gtk.CellRendererToggle()
cell.connect("toggled", on_toggle, model)
col = gtk.TreeViewColumn("Foo", cell, active=0)
tv.append_column(col)

w = gtk.Window()
w.connect("destroy", gtk.main_quit)
w.show()

w.add(tv)
tv.show()

## Some initial data
model.append([True])
model.append([False])

gtk.main()