在PyGtk中设置GtkTreeViews时遇到问题

0 投票
2 回答
563 浏览
提问于 2025-04-15 22:29

我有一些代码在一个扩展了 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)、两个字符串(strstr)的列,而不是你现在这样做的方式。其次,你需要把渲染器的属性和模型中相应的列绑定起来,比如像下面这样:

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

然后,你需要把渲染器的editable属性设置为True,这样它才能被编辑。最后,你还需要自己处理一些信号(比如changed或者editing-done,这取决于渲染器的类型),并相应地更新数据存储。

如果觉得这些步骤比较复杂,可以考虑使用一些辅助工具,比如Py-gtktree,那里甚至有一个关于如何编辑树的示例。

撰写回答