Расхождение в поведении в списке Tkinter, клавиши со стрелками и щелчок мышью - PullRequest
0 голосов
/ 08 июня 2018

Моя среда - 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()

Вот результаты при использовании клавиш со стрелками:

ArrowKeys

Но вот что вы получаете, когда нажимаете мышью:

MouseClick

Информация «отстает» позади, показывая вместо этого предыдущий выбор.(Если вы щелкнете по тому же предмету во второй раз, он «догоняет».)

Итак, мои вопросы:

  1. В чем причина расхождения?
  2. Как это исправить, чтобы щелчок мышью дал правильный результат?

1 Ответ

0 голосов
/ 08 июня 2018

Активный элемент не обязательно совпадает с выбранным элементом.Когда вы нажимаете кнопку мыши, она меняет выбранное значение , но не меняет активный элемент .Активный элемент изменяется только после того, как вы отпустите кнопку мыши.

Чтобы увидеть это, нажмите и удерживайте кнопку мыши над элементом, который в данный момент не выбран.Когда вы это сделаете, вы увидите что-то вроде этого:

enter image description here

На изображении выше активным элементом является пунктирный контур.Выбранный элемент выделен синим цветом.Когда ваш код отображает «фокус», он отображает активный элемент, а не выбранный элемент.

Если вы хотите выбрать выбранный элемент, вам нужно использовать curselection, чтобы получить индекс выбранного элемента.Он возвращает кортеж, поэтому в расширенном режиме вам нужно получить первый возвращаемый элемент (например: lb.curselection()[0]).Обязательно обработайте случай, когда curselection возвращает пустую строку.

...