迁移到 pygobject、glade 和 gtk3 时使用条目组合框
题
我用 python 和glade 和 pygtk 开发了 3 个月,但甚至在我有时间习惯它之前,它就已经过时了。
使用 Archlinux,我的系统不断更新,所以我被迫使用 gtk3,即使我发现它与 gtk2 相比有点缺乏功能。
所以我决定改用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()
如您所见,旧代码已被注释。
这段代码有效,但我有一个奇怪的问题:我无法使用该条目!
我可以从组合框中选择文本,但该条目不可用。我可以选择,但无法输入。
这是我需要在某处激活的新行为吗?使用gtk2版本的程序,我没有任何问题。
这是我的林间空地文件中描述组合框条目的部分:
<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>
我创建了一个列表存储,其中包含包含文本的 gchararray 类型的一列。单元格由 GtkCellRenderer 渲染(但 cellrenderer 的属性“text”未定义,因为如果我将其定义为 0(gchararray),我会得到文本 两次 !)
我认为添加一个入口缓冲区会有帮助,但它不会改变任何东西。
编辑 :我找到了解决方案:对于嵌入条目,can_focus 为 false。现在它可以工作了,不需要入口缓冲区。
我在发布此问题之前找到了解决方案,但我将其发布以防其他用户也遇到此问题。
解决方案
将ComboBox的嵌入条目的CAN_FOCUS属性更改为TRUE。
其他提示
如果您更喜欢使用 get_active_text()
方法,那么你只需要创建一个 Gtk.ComboBoxText
代替 Gtk.ComboBox
. 。这个 API 在 GTK 3 中被分成另一个类。