【问题标题】:Needing to select the item twice in the treeview before being able to activate combo box需要在树视图中选择两次才能激活组合框
【发布时间】:2012-12-20 02:54:24
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: drop-down-menu combobox gtk pygtk gtktreeview


    【解决方案1】:

    您在上面提到的代码的问题似乎是 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,您提到的代码和我对它的更改都是合理的。我不太确定哪种情况会要求这样做。另一方面,如果 TreeViewComoBox' ListStore 的内容由于搜索操作或在其他地方完成的过滤而变化,那么应该进行搜索而不是更改行调用populate_combo

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

        self.populate_combo()
    

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

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

    【讨论】:

    • 谢谢!完全明白你的意思。所以我应该改用树视图中的信号。
    • 很高兴它有所帮助,但请查看我上面的新评论,因为它可能有助于制作更合理的设计。
    • 明白!让我更深入地了解如何使用 PyGTK。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2018-01-08
    • 2016-06-01
    • 2018-09-07
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多