搜索后获取Gtk ComboBox的活动项目

时间:2014-04-10 20:58:24

标签: python gtk pygtk

我在PyGTK中使用以下代码创建了一个Gtk.ComboBox条目:

completer = Gtk.EntryCompletion()
completer.set_model(combo.get_model())
completer.set_text_column(0)
combo.get_child().set_completion(completer)

我确实有一些项目(> 400),因此滚动组合框寻找特定的项目相当繁琐。但是,当我使用条目输入文本,搜索项目然后选择一个项目时,调用get_active()以响应changed信号返回-1 ...?当滚动到项目而不搜索然后选择它时,它按预期工作。

我可以使用combo.get_child().get_text()获取条目中的文字,但我无法搜索模型,因为每个条目都可能显示多个项目。

如何搜索文本,选择项目,然后获取原始模型的选定行?

#!/usr/bin/python
from gi.repository import Gtk

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self)
        self.add_combo()

    def add_combo(self):
        store = Gtk.ListStore(str)
        combo = Gtk.ComboBox(model=store, has_entry=True)
        combo.set_entry_text_column(0)
        store.append(('Hello',))
        store.append(('World',))

        completer = Gtk.EntryCompletion()
        completer.set_model(combo.get_model())
        completer.set_text_column(0)
        combo.get_child().set_completion(completer)

        combo.connect('changed', self.changed)

        self.add(combo)

    def changed(self, combo):
        print 'active', combo.get_active()

win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

要重现:在条目中输入W,选择World,获取active -1,我期望active 1

1 个答案:

答案 0 :(得分:1)

完成并不知道组合(并且组合不知道完成),因此它无法更新活动值。我认为应该这样做:

# in initialization:
completer.connect("match-selected", self.match_selected)
self.combo = combo

def match_selected(self, completion, model, iter):
    self.combo.set_active_iter (iter)

那就是说,这仍然没有涵盖某人只是写一个匹配字符串的可能性...