2

我正在使用 GTK+ 和 PyGTK 绘制 GUI。

我在 TreeView 中创建了一个 ComboBox。但问题是当我第一次单击一个项目时,下拉箭头不敏感(灰显)。我必须单击另一个项目,然后再次返回该项目以使下拉箭头再次敏感。

这是 TreeView 中 ComboBox 的标准吗?如果您有任何其他语言的修复程序,我也可以接受。

一个例子可以在这里找到。 他还面临一些其他问题,但他的代码也证明了这个问题。

4

1 回答 1

1

您在上面提到的代码的问题似乎是ComboBox当您开始编辑时实际上只有 1 个元素,这使得下拉功能无用(因此无效)。为了让它像我怀疑你希望的那样运行,你所要做的就是使用另一个信号来执行self.populate_combo. 我在创建树视图后添加了两行以使其工作:

    treeview = gtk.TreeView(liststore_hardware)
    sel = treeview.get_selection()
    sel.connect("changed", self.populate_combo)

也就是说,我对组合进行了更改的选择原因填充,这意味着当控制返回到主循环时,它们中有多个元素。因此下拉工作。

我还注释掉了前一个editing-started信号,因为它没有对程序的当前结构添加任何内容。

    window.connect("destroy", lambda w: gtk.main_quit())
    #self.cellrenderer_combo.connect("editing-started", self.populate_combo)
    self.cellrenderer_combo.connect("edited", self.combo_changed, liststore_hardware)

编辑:

再想一想,该模型是运行None后的__init__,而不是我上面写的每行长度为 1 的模型,这使得缺少下拉功能更加合理。

评论:

如果更改行(或编辑)导致强烈需要重写ListStore. 我不确定哪种情况会要求这样做。另一方面,如果'TreeViewComoBox'的内容ListStore由于搜索操作或在 else-where 完成的过滤而变化,则应该调用该搜索而不是行的更改populate_combo

所以手头代码范围内的替代解决方案,我上面建议的事件也可以注释掉,一个简单的

    self.populate_combo()

作为init函数的最后一行添加。

此外,如果在应用程序运行期间需要重新填充组合,我建议ListStore修改当前而不是每次都创建一个新组合,如果预计变化不会很大(在这种情况下make a new 可能是最快和最简单的)。

于 2012-12-26T02:30:13.900 回答