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

0 投票
1 回答
2146 浏览
提问于 2025-04-18 02:15

我在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 个回答

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)

不过,这样做还是不能解决有人直接输入一个匹配的字符串的情况...

撰写回答