在PyGtk中设置GtkTreeViews时遇到问题
我有一些代码在一个扩展了 gtk.TreeView
的类里,这是 init
方法。我想创建一个有三列的树形视图。第一列是一个切换按钮,第二列是一个标签,第三列是一个下拉框,用户可以在里面输入内容。下面的代码可以运行,但有几个问题:切换按钮对鼠标点击没有反应,标签和下拉框也没有显示出来。(所以可以说这段代码不太好用)。不过,我可以正常添加行。
#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 个回答
1
只需要把 toggled
信号连接到 gtk.CellRendererToggle 上。当你点击它的时候,它会发出这个信号,然后在你的回调函数里改变模型中的值。
例如:
def toggle(self, cellrenderer, path):
Self.model[path][column] = not self.model[path][column]
self.model
是和树视图关联的模型。
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,那里甚至有一个关于如何编辑树的示例。