提交建议

时间:2010-02-12 08:35:37

标签: python pygtk

我正在构建一个小的PyGTK应用程序,我有一个文本输入字段(当前是一个ComboBoxEntry),其中填充了一些用户应该可以选择的值。

我认为我想要做的是过滤掉匹配的字段并仅显示那些字段,以便使用键盘箭头的用户可以选择其中一个匹配字段。

为了给出一些背景知识,预定义值是一堆网址,用户应该可以从theese中选择或填写一个新的。

实施例: 预定义的网址:

当用户输入“http://www.g”时 以该字符串开头的三个URL将以某种方式显示,并且在键入“http://www.goog”时,将显示以该字符串开头的两个URL

任何想法?

3 个答案:

答案 0 :(得分:6)

Entry ComboBoxEntry似乎比# simplified example from the tutorial import gtk urls = [ 'http://www.google.com', 'http://www.google.com/android', 'http://www.greatstuff.com', 'http://www.facebook.com', ] liststore = gtk.ListStore(str) for s in urls: liststore.append([s]) completion = gtk.EntryCompletion() completion.set_model(liststore) completion.set_text_column(0) entry = gtk.Entry() entry.set_completion(completion) # boilerplate window = gtk.Window() window.add(entry) window.connect('destroy', lambda w: gtk.main_quit()) window.show_all() gtk.main() 更合适。与往常一样,EntryCompletion是一个良好的开端。

当预定义的URL列表很小并且已修复时,可以很容易地进行设置。 您只需要填充ListStore:

def match_anywhere(completion, entrystr, iter, data):
    modelstr = completion.get_model()[iter][0]
    return entrystr in modelstr
completion.set_match_func(match_anywhere, None)

用户不太可能打扰输入“http://”甚至“www。”,因此您可能想要匹配网址的任何部分(例如只是“og”有效!):

{{1}}

这将测试ListStore中的每个值是否匹配,因此它不能扩展到大型列表(我的意思是巨大; 1000可以正常工作)。

请务必使用EntryCompletion的各种选项,以配置最愉快的行为。

答案 1 :(得分:0)

您可能希望了解Deskbar AppletCuemiac是如何做到的。

答案 2 :(得分:0)

嗯,你显然想要处理前缀,所以你可能想要使用某种特里。当然,还有一些问题需要处理。例如,在一个人输入几个字母(或者甚至只是一个字母)之后,您将要遍历特里结构的其余分支以查找建议,或者在每个节点中存储建议。很多这类决定取决于你计划提出多少可能的建议。