0

实际上,我有一个列表(fooId,fooName),我需要显示一个下拉列表,该列表仅显示该列表中的 fooName。但是,当我需要从用户那里获取所选项目时,我只想获取 fooId 而不是 fooName。

根据文档,我目前正在这样做:

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)

正如您可以想象的那样,除了 ComboBox 显示一个带有下拉列表的条目之外,这些行做得很好。我不需要这个条目,所以我尝试使用:

self.cb = Gtk.ComboBox.new_with_model(foo_list)

但是现在我的下拉列表是空的。

任何想法?

4

1 回答 1

1

我理解你的问题。您需要像这样创建 CellRendererText:

#-*- 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()

当您使用Entry 创建一个 ComboBox 时,ComboBox 会为您的模型假定一个渲染器配置,因为它假定您毕竟将获得一个字符串,它可以由用户输入或用户选择,但最后您将关心该字符串,所以,您的模型将是“扁平”的,只有一列。大多数情况下都是如此,一个例外是当您使用条目执行自动搜索时,但为此有一个特殊的设置,特殊的关联对象并且更高级。

如果您要创建没有条目的 ComboBox,则需要定义模型和演示文稿之间的匹配。为此,有几种类型的渲染器:CellRendererPixbuf、CellRendererText、gtk.CellRendererToggle、CellRendererSpinner 等。

每个渲染器都有一组属性,您可以将这些属性与模型中的列进行匹配。在上面的示例中,我将一个 CellRendererText 对象放在 ComboBox 中,该对象的“文本”属性(显示在下拉列表中的属性)映射到模型列 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()
于 2013-05-07T15:33:17.727 回答