我在扩展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])
答案 0 :(得分: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 - 甚至还有一个在那里编辑树的例子。
答案 1 :(得分:1)
只需连接gtk.CellRendererToggle中的toggled
信号,当您点击它时,它会发出该信号,然后在您的回调中更改模型中的值。
EJ。
def toggle(self, cellrenderer, path):
Self.model[path][column] = not self.model[path][column]
self.model
是与树视图相关联的模型,