@Khariton84
На старости лет сел поучиться

При вызове события bind('') не учитывает значения кнопки нажатия, как исправить?

Учусь и вопросы возможно глупые)
Дано:
Есть заранее прописанный список.
Создано поле ввода Entry
Создано поле отображения Listbox

Когда пользователь вводит данные в поле ввода в листбоксе должны отображаться значения из списка, в которых есть совпадение с введённым текстом.

Проблема:
данные учитываются с запозданием на 1 символ, то есть тот символ который вызывает срабатывание функции поиска и отображения не учитывается

ниже код
pril=['hdhd','pertte','etewt','ertwew','vvviviv']
def pril_poisk(event):
lbox.delete(0, END)
b=[]
temp=e.get()
print(temp)
for i in range(len(pril)):
a=pril[i].find(temp)
if a!=-1:
lbox.insert(END, pril[i])
else:
pass
#вводим пункты приложения
e=Entry(window, width=15)
e.grid(row=4, column=0)
e.bind('', pril_poisk)

lbox=Listbox(window, width=25, selectmode=EXTENDED)
lbox.grid(row=7, column=0)>

  • Вопрос задан
  • 34 просмотра
Решения вопроса 1
@Khariton84 Автор вопроса
На старости лет сел поучиться
Так как никто не ответил, сам придумал такое решение
сделать обработчик который будет улавливать char из вводимого символа и соответственно добавлять его в поиск, так как поле ввода только на русском, то вышло таким образом:

alf=['я','ч','с','м','и','т','ь','б','ю','ф','ы','в','а','п','р','о','л','д','ж','э','й','ц','у','к','е','н','г','ш','щ','з','х','ъ','.','1','2','3','4','5','6','7','8','9','0']
numb={'keycode=190':'.','keycode=191':'.','keycode=49':'1','keycode=50':'2','keycode=51':'3','keycode=52':'4','keycode=53':'5','keycode=54':'6','keycode=55':'7','keycode=56':'8','keycode=57':'9','keycode=48':'0'}

#чтобы не терять первый символ ввода(последний в строке)
def obrabotka_sobitija(event):
    temp1=str(event)
    temp2=temp1.split(' ')
    temp3=temp2[4]
    temp1=temp3.replace('char=','')
    temp3=temp1.replace("'",'')
    try:
        if temp3 not in alf:
            temp3=numb[temp3]
    except:
        pass
    print(event,'\n',temp3)
    return temp3
    

def pril_poisk(event, lbActiv, lbPass, entr, spis):
    last_key=obrabotka_sobitija(event)
    lbActiv.delete(0, END)
    lbPass.delete(0,END)
    global b
    b=[]
    if last_key in alf:
        temp=entr.get()+first_key
    else:
       temp=entr.get()
    print(temp)   
    for i in range(len(spis)):
        a=spis[i].find(temp)
        if a!=-1:
            b.append(spis[i])
            lbActiv.insert(END, spis[i])
        else:
            pass


но было бы круто если б кто более элегантное решение подсказал. спасибо
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Я думаю тебе надо проверять соответствие текста в Entry со списком когда пользователь пишет в Entry.
Чтобы проверить что в Entry надо проверять после каждого нажатия на клавиши. Чтобы взять текст с Entry надо использовать: название entry.get()
Ну а потом:
if название entry.get() in список:
    добавить в Listbox
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
iCode Москва
от 90 000 до 200 000 ₽
SwapZilla.co Москва
от 200 000 ₽
SwapZilla.co Сочи
от 200 000 ₽