2013-05-07 59 views
0

實際上,我有一個列表(fooId,fooName),我需要顯示一個下拉列表,只顯示列表中的fooName。但是,當我需要從用戶獲取所選項目時,我只想獲取fooId而不是fooName。通過使用PyGObject組合框顯示沒有輸入的下拉列表

根據該文件,我正在這樣做:

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) 

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

有什麼想法?

回答

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

組合框呈現渲染器配置爲您的模型,因爲它假定你會終究得到一個字符串,也可以是用戶輸入用戶選擇,但最後你會關心該字符串,所以,你的模型將是「平坦的」,只有一列。大多數情況都是如此,當你使用條目執行自動搜索時是一個例外,但爲此,有一個特殊的設置,特殊的關聯對象,並且更先進。

如果您創建的組合框沒有條目您需要定義您的模型和您的演示文稿之間的匹配。爲此,有幾種類型的渲染器: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() 
+0

非常感謝!你的解釋是完美的! :d – gaetanm 2013-05-07 18:18:31

相關問題