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

У меня есть код в классе, который расширяет gtk.TreeViewи это init метод. Я хочу создать древовидное представление с тремя столбцами. Кнопка переключения, метка и раскрывающийся список, в которые пользователь может вводить данные. Приведенный ниже код работает, за исключением того, что кнопка переключения не реагирует на щелчки мыши, а метка и 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])

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 - там даже есть пример для редактирования дерева там.

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

EJ.

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

self.model это модель, связанная с деревом,

Другие вопросы по тегам