Вход с предложениями - PullRequest
       7

Вход с предложениями

6 голосов
/ 12 февраля 2010

Я создаю небольшое приложение PyGTK, и у меня есть поле для ввода текста (в настоящее время ComboBoxEntry), которое заполнено несколькими значениями, из которых пользователь должен иметь возможность выбирать.

Я думаю, что янужно отфильтровать совпадающие поля и показать только те, чтобы пользователь с помощью стрелок на клавиатуре мог выбрать одно из совпадающих.

Чтобы получить некоторый фон, предопределенные значения представляют собой набор URL-адресов ипользователь должен иметь возможность выбрать из этого или заполнить новый.

Пример: предопределенные URL:

Когда пользователь вводит 'http://www.g' Три URL, начинающиеся с этой строки, должны отображаться (в некоторыхпуть) и при наборе 'http://www.goog' должны отображаться два, начиная с этого

Любые идеи?

Ответы [ 3 ]

7 голосов
/ 14 февраля 2010

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, чтобы настроить наиболее приятное поведение.

0 голосов
/ 12 февраля 2010

Ну, вы, очевидно, хотите иметь дело с префиксами, так что вы, вероятно, захотите использовать какую-то трия. Конечно, есть проблемы, с которыми нужно иметь дело. Например, после того, как человек набрал несколько букв (или, может быть, даже одну), вы захотите либо просмотреть остальные ветви дерева, чтобы найти предложения, либо сохранить предложения в каждом узле. Многие решения такого рода зависят от того, сколько возможных предложений вы планируете получить.

0 голосов
/ 12 февраля 2010

Возможно, вы захотите посмотреть, как апплет Deskbar Cuemiac делает это.

...