Помогите разобраться с ошибкой! Как переключаться между полями ввода (Entry) с помощью клавиш "вверх" и "вниз"?

S

Пользователь

от shbidibom , в категории: Python , 8 месяцев назад

Набросал демонстративный код :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import tkinter as tk




def downKey(event):
    handle = event.widget.focus_get()
    lstHandle[lstHandle.index(handle) + 1].focus()


def upKey(event):
    handle = event.widget.focus_get()
    lstHandle[lstHandle.index(handle) - 1].focus()




win = tk.Tk()
win.geometry("500x500+500+200")




win.bind('<Down>', downKey)
win.bind('<Up>', upKey)


lstHandle = []


ent1 = tk.Entry()
lstHandle.append(ent1)
ent1.place(x=196,y=5)


ent2 = tk.Entry()
lstHandle.append(ent2)
ent2.place(x=196,y=30)


ent3 = tk.Entry()
lstHandle.append(ent3)
ent3.place(x=196,y=55)


ent4 = tk.Entry()
lstHandle.append(ent4)
ent4.place(x=196,y=80)


ent5 = tk.Entry()
lstHandle.append(ent5)
ent5.place(x=196,y=105)




win.mainloop()

Вроде работает так как надо, но когда фокус перемещается на последнее поле ввода,после нажатия клавиши "вниз" возникает ошибка - "IndexError: list index out of range", хотя должно перебросится обратно на самый верхний виджет. С кнопкой "вверх" все работает так как нужно. Ребят, кто может, подскажите как это исправить ?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от patrick.little , 8 месяцев назад

@shbidibom  Проблема, о которой вы говорите, связана с тем, что при нажатии клавиши "вниз" вы пытаетесь перейти к следующему виджету в lstHandle, когда текущий виджет уже является последним в списке. Это вызывает IndexError, так как индекс следующего виджета на один больше, чем длина списка.


Чтобы исправить эту проблему, вы можете модифицировать ваш код так, чтобы после перехода к последнему виджету при нажатии клавиши "вниз", фокус возвращался к первому виджету. Вот как это можно сделать:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import tkinter as tk


def downKey(event):
    handle = event.widget.focus_get()
    index = lstHandle.index(handle)
    if index < len(lstHandle) - 1:
        lstHandle[index + 1].focus()
    else:
        lstHandle[0].focus()


def upKey(event):
    handle = event.widget.focus_get()
    index = lstHandle.index(handle)
    if index > 0:
        lstHandle[index - 1].focus()
    else:
        lstHandle[-1].focus()


win = tk.Tk()
win.geometry("500x500+500+200")


win.bind('<Down>', downKey)
win.bind('<Up>', upKey)


lstHandle = []


ent1 = tk.Entry()
lstHandle.append(ent1)
ent1.place(x=196, y=5)


ent2 = tk.Entry()
lstHandle.append(ent2)
ent2.place(x=196, y=30)


ent3 = tk.Entry()
lstHandle.append(ent3)
ent3.place(x=196, y=55)


ent4 = tk.Entry()
lstHandle.append(ent4)
ent4.place(x=196, y=80)


ent5 = tk.Entry()
lstHandle.append(ent5)
ent5.place(x=196, y=105)


win.mainloop()

Теперь при нажатии клавиши "вниз", если фокус на последнем виджете, он переходит к первому виджету, а при нажатии клавиши "вверх", если фокус на первом виджете, он переходит к последнему виджету.