在PyGtk中设置GtkTreeViews时遇到问题

时间:2010-05-08 13:44:30

标签: python gtk pygtk gtktreeview

我在扩展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])

2 个答案:

答案 0 :(得分:2)

首先,您需要创建一个包含boolstrstr列的模型,而不是您现在的方式。其次,您需要从适当的模型列绑定渲染器的属性,例如:如在

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

然后,您需要将渲染器上的editable属性设置为True。最后,您需要自己处理信号(changedediting-done,具体取决于渲染器类型)并相应地更新商店。

使用一些助手可能更容易,例如 Py-gtktree - 甚至还有一个在那里编辑树的例子。

答案 1 :(得分:1)

只需连接gtk.CellRendererToggle中的toggled信号,当您点击它时,它会发出该信号,然后在您的回调中更改模型中的值。

EJ。

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

self.model是与树视图相关联的模型,