Entry
с EntryCompletion
кажется более подходящим, чем 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, чтобы настроить наиболее приятное поведение.