我理解你的问题。您需要像这样创建 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()