迁移到pygobject,glade和gtk3时使用条目组合框

Jér*_*tin 5 python combobox glade pygobject gtk3

我从3个月开始使用glade和pygtk在python中开发,但即使在我有时间习惯它之前,它已经过时了.

使用Archlinux,我的系统一直都是最新的,所以即使我发现它与gtk2相比有点缺乏功能,我也不得不使用gtk3.

所以我决定切换到pygobject.不幸的是,文档不完整.

我成功地将我的glade文件和我的python代码升级到新系统,但是存在一个错误.

在我的一个程序中,我有一个带有条目的组合框.我用来调用方法get_active_text()来获取条目的内容,无论它是从组合框中选择还是由用户输入.

这个方法不再存在(我想,因为它给了我一个错误)所以我用它代替:

def get_license(self):
    #return self.combobox_license.get_active_text()
    tree_iter = self.combobox_license.get_active_iter()
    if tree_iter != None:
        model = self.combobox_license.get_model()
        return model[tree_iter][0]
    else:
        entry = self.combobox_license.get_child()
        return entry.get_text()
Run Code Online (Sandbox Code Playgroud)

如您所见,旧代码已被评论.

这段代码有效,但我有一个奇怪的问题:我不能使用该条目!

我可以从组合框中选择文本,但该条目不可用.我可以选择,但我无法输入.

这是我需要在某处激活的新行为吗?使用gtk2版本的程序,我没有任何问题.

以下是我的glade文件中描述组合框条目的部分:

  <object class="GtkComboBox" id="combobox_license">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="model">liststore_license</property>
    <property name="has_entry">True</property>
    <property name="entry_text_column">0</property>
    <signal name="changed" handler="on_combobox_license_changed" swapped="no"/>
    <child>
      <object class="GtkCellRendererText" id="cellrenderertext_license"/>
    </child>
    <child internal-child="entry">
      <object class="GtkEntry" id="combobox-entry2">
        <property name="can_focus">False</property>
        <property name="buffer">entrybuffer1</property>
      </object>
    </child>
  </object>
Run Code Online (Sandbox Code Playgroud)

我创建了一个列表库,其中包含一个包含文本的gchararray类型的列.单元格由GtkCellRenderer呈现(但是未定义cellrenderer的属性"text",因为如果我将其定义为0(gchararray),我会得到两次文本!)

我认为添加一个entrybuffer会有所帮助,但它不会改变任何东西.

编辑:我找到了解决方案:嵌入条目的can_focus为false.现在它可以工作,而不需要输入缓冲区.

我在发布之前找到了解决方案,但我发布了以防其他用户也遇到此问题.

Jér*_*tin 4

将组合框嵌入条目的 can_focus 属性更改为 true。