Python 使用PyGObject组合框显示不带条目的下拉列表

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

实际上,我有一个列表(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.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