带建议的条目
我正在制作一个小的PyGTK应用程序,里面有一个文本输入框(现在是一个ComboBoxEntry),这个输入框里有一些预设的值,用户可以从中选择。
我想做的是过滤出匹配的选项,只显示这些选项,这样用户就可以用键盘的上下箭头选择其中一个匹配的选项。
为了给你一些背景,这些预设的值是一堆网址,用户可以从中选择,或者输入一个新的网址。
举个例子,预设的网址有:
- http://www.google.com
- http://www.google.com/android
- http://www.greatstuff.com
- http://www.facebook.com
当用户输入 'http://www.g' 时,应该显示以这个字符串开头的三个网址(以某种方式显示),而当输入 'http://www.goog' 时,应该显示以这个字符串开头的两个网址。
有什么想法吗?
3 个回答
0
你可以看看Deskbar Applet的Cuemiac
是怎么做的。
0
好吧,你显然想处理前缀,所以你可能需要用到一种叫做“字典树”的数据结构。当然,这里也有一些问题需要解决。例如,当一个人输入了几个字母(或者可能只输入了一个字母)后,你就需要在字典树的其他分支中查找建议,或者在每个节点中存储建议。这些决策很大程度上取决于你计划提供多少个可能的建议。
8
使用一个带有 EntryCompletion
的 Entry
看起来比 ComboBoxEntry
更合适。像往常一样,这个教程 是个不错的起点。
当你预先定义的URL列表比较小且固定时,设置起来非常简单。你只需要填充一个 ListStore:
# 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()
用户通常不会麻烦去输入 "http://" 或者 "www.",所以你可能想要匹配URL的任何部分(比如只输入 "og" 也可以!):
def match_anywhere(completion, entrystr, iter, data):
modelstr = completion.get_model()[iter][0]
return entrystr in modelstr
completion.set_match_func(match_anywhere, None)
这会检查 ListStore 中的每个值是否匹配,所以对于非常大的列表来说,这种方法不太适用(我指的是 非常大;1000个是没问题的)。
一定要尝试调整 EntryCompletion 的各种选项,以配置出最舒适的使用体验。