проблемы с настройкой GtkTreeViews в PyGtk

У меня есть код в классе, который расширяет gtk.TreeView, и это метод init. Я хочу создать древовидное представление с 3 столбцами. Кнопка-переключатель, метка и раскрывающийся список, в который пользователь может вводить данные. Приведенный ниже код работает, за исключением того, что кнопка-переключатель не реагирует на щелчки мышью, а метка и ComboEntry не рисуются. (Поэтому, я думаю, вы можете сказать, что это не работает). Однако я могу добавлять строки просто отлично.

    #make storage                   enable/disable  label    user entry
    self.tv_store = gtk.TreeStore(gtk.ToggleButton, str, gtk.ComboBoxEntry)
    #make widget
    gtk.TreeView.__init__(self, self.tv_store)
    #make renderers
    self.buttonRenderer = gtk.CellRendererToggle()
    self.labelRenderer = gtk.CellRendererText()
    self.entryRenderer = gtk.CellRendererCombo()
    #make columns

    self.columnButton = gtk.TreeViewColumn('Enabled')
    self.columnButton.pack_start(self.buttonRenderer, False)
    self.columnLabel = gtk.TreeViewColumn('Label')
    self.columnLabel.pack_start(self.labelRenderer, False)
    self.columnEntry = gtk.TreeViewColumn('Data')
    self.columnEntry.pack_start(self.entryRenderer, True)

    self.append_column(self.columnButton)
    self.append_column(self.columnLabel)
    self.append_column(self.columnEntry)

    self.tmpButton = gtk.ToggleButton('example')
    self.tmpCombo = gtk.ComboBoxEntry(None)
    self.tv_store.insert(None, 0, [self.tmpButton, 'example label', self.tmpCombo])

person Chris H    schedule 08.05.2010    source источник


Ответы (2)


Прежде всего, вам нужно создать модель со столбцами bool, str и str, а не так, как вы делаете сейчас. Во-вторых, вам нужно привязать свойства средств визуализации из соответствующих столбцов модели, например. как в

self.columnButton = \
    gtk.TreeViewColumn ('Enabled', self.buttonRenderer, 
                        active = 0)  # 0 is the tree store column index

Затем вам нужно установить свойство editable в рендерере на True. И, наконец, вам нужно самостоятельно обрабатывать сигналы (changed или editing-done, в зависимости от типа рендерера) и соответствующим образом обновлять хранилище.

Может быть проще использовать некоторые помощники, например. Py-gtktree — там даже есть пример редактирования дерева.

person doublep    schedule 08.05.2010
comment
эээ, append_column для gtk.TreeView принимает только 1 аргумент, не так ли? - person Chris H; 08.05.2010

Просто подключите сигнал toggled в gtk.CellRendererToggle, когда вы нажмете на него, он будет излучать этот сигнал, а затем в вашем обратном вызове измените значение в модели.

ej.

def toggle(self, cellrenderer, path):
        Self.model[path][column] = not self.model[path][column]

self.model — это модель, связанная с древовидной структурой,

person markuz    schedule 11.05.2010