您在上面提到的代码的问题似乎是 ComboBox 在您开始编辑时实际上只有 1 个元素,这使得下拉功能无用(因此无效)。要让它按照我怀疑的方式运行,您所要做的就是使用另一个信号来执行self.populate_combo。我在创建树视图后添加了两行以使其工作:
treeview = gtk.TreeView(liststore_hardware)
sel = treeview.get_selection()
sel.connect("changed", self.populate_combo)
也就是说,我更改了 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)
编辑:
再想一想,模型是在运行__init__ 之后的None,而不是我上面写的每行长度为 1,这使得缺少下拉功能更加合理。
评论:
如果更改行(或编辑)导致强烈需要重写ListStore,您提到的代码和我对它的更改都是合理的。我不太确定哪种情况会要求这样做。另一方面,如果 TreeView 和 ComoBox' ListStore 的内容由于搜索操作或在其他地方完成的过滤而变化,那么应该进行搜索而不是更改行调用populate_combo。
所以在手头代码范围内的替代解决方案,我上面建议的事件也可以注释掉并且简单
self.populate_combo()
作为init 函数的最后一行添加。
此外,如果在应用程序运行期间需要重新填充组合,我建议修改当前的ListStore,而不是每次都创建一个新的,如果预计不会发生变化是专业的(在这种情况下,制造一个新的可能是最快和最简单的)。