Получение переключателей в GtkTreeView - PullRequest
2 голосов
/ 18 апреля 2011

Я использую дерево с флажками. Я хочу, чтобы пользователь мог установить флажок, и он добавит этот элемент в список избранного. Но в настоящее время я не могу заставить коробки переключаться вообще. Вот мой код:

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 Ответ

3 голосов
/ 19 апреля 2011

Отказ от ответственности : я уверен, что это не полная bs, но в данный момент не могу проверить это.

Во-первых, CellRendererToggle не принимает текстовое свойство.во-вторых, если вы все равно установите его, вы не установите его на индекс столбца 7, потому что у вас есть только 7 столбцов в хранилище списков (а индекс 7 будет восьмым столбцом).

Вы можете видеть все доступныесвойства, которые вы можете установить для вашего рендерера в ссылка в «Свойствах» (обратите внимание также на унаследованные свойства).Теперь, чтобы установить свойство для каждой отдельной ячейки (для каждой строки), вы можете указать, как вы это сделали, аргумент ключевого слова.Таким образом, в вашем TreeviewColumn вы должны установить это:

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

Любой набор атрибутов, подобный этому, сопоставляется с соответствующей записью в списке списков.Это означает, что вы можете напрямую изменить его в хранилище списков или с помощью обратного вызова (например, on_toggle).

Редактировать:

Возможно, вам также нужно установить свойство режима

Редактировать 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()
...