Python 使用PyGObject组合框显示不带条目的下拉列表
实际上,我有一个列表(fooId,fooName),我需要显示一个下拉列表,其中只显示这个列表中的fooName。但是,当我需要从用户那里获取所选项目时,我只想获取fooId而不是foodname 根据文件,我目前正在这样做:Python 使用PyGObject组合框显示不带条目的下拉列表,python,combobox,pygobject,Python,Combobox,Pygobject,实际上,我有一个列表(fooId,fooName),我需要显示一个下拉列表,其中只显示这个列表中的fooName。但是,当我需要从用户那里获取所选项目时,我只想获取fooId而不是foodname 根据文件,我目前正在这样做: someFoo = model.getSomeFoo() foo_list = Gtk.ListStore(int, str) for foo in someFoo: foo_list.append([foo[0], foor[1]]) self.cb = Gtk
someFoo = model.getSomeFoo()
foo_list = Gtk.ListStore(int, str)
for foo in someFoo:
foo_list.append([foo[0], foor[1]])
self.cb = Gtk.ComboBox.new_with_model_and_entry(foo_list)
self.cb.set_entry_text_column(1)
正如您可以想象的那样,除了组合框显示一个带有下拉列表的条目外,这些行都是正确的。我不需要此条目,因此我尝试使用:
self.cb = Gtk.ComboBox.new_with_model(foo_list)
但是现在我的下拉列表是空的
有什么想法吗?我理解你的问题。您需要创建一个CellRenderText,如下所示:
#-*- coding: UTF-8 -*-
from gi.repository import Gtk
class App(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='ComboBox Test')
model = Gtk.ListStore(int, str)
for i in [[1, 'One'], [2, 'Two'], [3, 'Three'], [4, 'Four']]:
model.append(i)
combo = Gtk.ComboBox.new_with_model(model)
renderer = Gtk.CellRendererText()
combo.set_active(0)
combo.pack_start(renderer, True)
combo.add_attribute(renderer, 'text', 1)
combo.connect('changed', self._changed_cb)
self.add(combo)
# Variables
self.combo = combo
self.model = model
def _changed_cb(self, widget, param=None):
comboiter = self.combo.get_active_iter()
if comboiter:
print("Changed to {}".format(
self.model.get_value(comboiter, 0)
))
else:
print("Nothing selected!")
win = App()
win.connect('delete-event', Gtk.main_quit)
win.show_all()
Gtk.main()
当您使用条目创建组合框时,组合框假定您的模型具有渲染器配置,因为它假定您将获得一个字符串。毕竟,它可以由用户输入或由用户选择,但最后您将关心该字符串,因此,您的模型将“平坦”,只有一列。大多数情况下都是这样,当您使用条目执行自动搜索时会出现例外情况,但是有一个特殊的设置、特殊的关联对象,而且更高级
如果要创建一个组合框而不包含条目,则需要定义模型和演示文稿之间的匹配。为此,有几种类型的渲染器:CellRenderPixBuf、CellRenderText、gtk.CellRenderToggle、CellRenderSpinner等
每个渲染器都有一组属性,可以与模型中的列相匹配。在上面的示例中,我将CellRenderText对象放在组合框中,该组合框的“文本”属性(下拉列表中显示的属性)映射到模型列1
下面是相同的示例,但使用了更多属性,在本例中为文本的颜色:
#-*- coding: UTF-8 -*-
from gi.repository import Gtk
class App(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='ComboBox Test')
model = Gtk.ListStore(int, str, str)
for i in [[1, 'One', '#FF0000'], [2, 'Two', '#00FF00'], [3, 'Three', '#0000FF'], [4, 'Four', '#FFFF00']]:
model.append(i)
combo = Gtk.ComboBox.new_with_model(model)
renderer = Gtk.CellRendererText()
combo.set_active(0)
combo.pack_start(renderer, True)
combo.add_attribute(renderer, 'text', 1)
combo.add_attribute(renderer, 'foreground', 2)
combo.connect('changed', self._changed_cb)
self.add(combo)
def _changed_cb(self, combo, param=None):
comboiter = combo.get_active_iter()
if comboiter:
print("Changed to {}".format(
combo.get_model().get_value(comboiter, 0)
))
else:
print("Nothing selected!")
win = App()
win.connect('delete-event', Gtk.main_quit)
win.show_all()
Gtk.main()
非常感谢你!你的解释很好D