我正在使用 GTK+ 和 PyGTK 绘制 GUI。
我在 TreeView 中创建了一个 ComboBox。但问题是当我第一次单击一个项目时,下拉箭头不敏感(灰显)。我必须单击另一个项目,然后再次返回该项目以使下拉箭头再次敏感。
这是 TreeView 中 ComboBox 的标准吗?如果您有任何其他语言的修复程序,我也可以接受。
一个例子可以在这里找到。 他还面临一些其他问题,但他的代码也证明了这个问题。
我正在使用 GTK+ 和 PyGTK 绘制 GUI。
我在 TreeView 中创建了一个 ComboBox。但问题是当我第一次单击一个项目时,下拉箭头不敏感(灰显)。我必须单击另一个项目,然后再次返回该项目以使下拉箭头再次敏感。
这是 TreeView 中 ComboBox 的标准吗?如果您有任何其他语言的修复程序,我也可以接受。
一个例子可以在这里找到。 他还面临一些其他问题,但他的代码也证明了这个问题。
您在上面提到的代码的问题似乎是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
. 我不确定哪种情况会要求这样做。另一方面,如果'TreeView
和ComoBox
'的内容ListStore
由于搜索操作或在 else-where 完成的过滤而变化,则应该调用该搜索而不是行的更改populate_combo
。
所以手头代码范围内的替代解决方案,我上面建议的事件也可以注释掉,一个简单的
self.populate_combo()
作为init
函数的最后一行添加。
此外,如果在应用程序运行期间需要重新填充组合,我建议ListStore
修改当前而不是每次都创建一个新组合,如果预计变化不会很大(在这种情况下make a new 可能是最快和最简单的)。