Моя среда - Python 2.7, работающая в Windows 7.
Я пытаюсь получить Tkinter Listbox для запуска обратного вызова в ответ на изменение пользователем активного элемента (т.е. элемента с фокусом),Я использую привязку к событию <<ListboxSelect>>
, чтобы это произошло, и оно работает - вроде.
Предполагается, что сам обратный вызов проверяет, что представляет собой новый активный элемент, и выполняет некоторую обработку.соответственно.Эта логика работает так, как я ожидаю, когда меняю активный элемент с помощью клавиш со стрелками вверх / вниз.Но когда я вместо этого указываю и щелкаю по новому элементу, код по ошибке идентифицирует предыдущий активный элемент как текущий.
Вот урезанный пример кода, который иллюстрирует поведение, которое я получаю:
import Tkinter as tk
#Root window
root = tk.Tk()
#Callback to show focus change
def updateDisplay(*args):
focusIndex = str(lb.index(tk.ACTIVE))
ctrlFI.set('Focus is at index '+focusIndex)
#Control variables
ctrlLB = tk.StringVar()
ctrlFI = tk.StringVar()
#Widgets
lb = tk.Listbox(root,
width=20, height=10,
relief=tk.FLAT,highlightthickness=0,
selectmode=tk.EXTENDED,
activestyle='dotbox',
listvariable=ctrlLB)
lbl = tk.Label(root,
justify=tk.LEFT, anchor=tk.W,
textvariable=ctrlFI)
lb.grid(row=0,column=0,sticky=tk.NW,padx=(5,0),pady=5)
lbl.grid(row=1,column=0,columnspan=2,sticky=tk.NW,padx=5,pady=5)
#Listbox binding to trigger callback
lb.bind('<<ListboxSelect>>',updateDisplay)
#Initializations to prep GUI
ctrlLB.set('Index0-entry Index1-entry Index2-entry Index3-entry Index4-entry')
ctrlFI.set('Ready')
#Begin app
tk.mainloop()
Вот результаты при использовании клавиш со стрелками:
Но вот что вы получаете, когда нажимаете мышью:
Информация «отстает» позади, показывая вместо этого предыдущий выбор.(Если вы щелкнете по тому же предмету во второй раз, он «догоняет».)
Итак, мои вопросы:
- В чем причина расхождения?
- Как это исправить, чтобы щелчок мышью дал правильный результат?