我明白你的問題。您需要創建一個這樣的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()
組合框呈現渲染器配置爲您的模型,因爲它假定你會終究得到一個字符串,也可以是用戶輸入用戶選擇,但最後你會關心該字符串,所以,你的模型將是「平坦的」,只有一列。大多數情況都是如此,當你使用條目執行自動搜索時是一個例外,但爲此,有一個特殊的設置,特殊的關聯對象,並且更先進。
如果您創建的組合框沒有條目您需要定義您的模型和您的演示文稿之間的匹配。爲此,有幾種類型的渲染器:CellRendererPixbuf,CellRendererText,gtk.CellRendererToggle,CellRendererSpinner等。
每個渲染器都有一組屬性,您可以在模型中與列匹配。在上面的例子中,我將一個CellRendererText對象放置在組合框中,該對象具有映射到模型列1的'text'屬性(顯示在下拉列表中的那個屬性)。
這裏是相同的示例但玩更多的屬性,在這種情況下,文本的顏色:
#-*- 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 – gaetanm 2013-05-07 18:18:31