Запись с предложениями

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

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

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

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

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

Любые идеи?


person Joelbitar    schedule 12.02.2010    source источник
comment
Я думаю, что вы имеете в виду автозаполнение.   -  person alexn    schedule 12.02.2010
comment
Я ищу решение, совместимое с gtk3. Глупая история, всегда разбавляющая настоящее.   -  person ThorSummoner    schedule 29.01.2015


Ответы (3)


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

person Beni Cherniavsky-Paskin    schedule 14.02.2010

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

person Ignacio Vazquez-Abrams    schedule 12.02.2010

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

person Justin Peel    schedule 12.02.2010
comment
Я планирую иметь небольшое количество предложений, максимум 10. - person Joelbitar; 13.02.2010
comment
если у вас всего 10 предложений, то просто возьмите введенный текст и сравните его с началом каждого из ваших предложений. Если они совпадают, добавьте предложение в список предложений. - person Justin Peel; 13.02.2010