Tkinter Listbox以蓝色突出显示一个元素,但是将黑色边框放在另一个元素周围?

Art*_*are 2 python tk-toolkit listbox tkinter

我正在编写一个带有Tkinter GUI的应用程序,其中包括我想要键盘访问的长列表框.

在使用箭头键一次滚动一个项目是乏味的,所以我想,让用户在列表中更快速地移动,通过打字了元素的名称,也使得page up,page down,home,和end工作.

问题是,当我使用Listbox的select_set()方法时,它似乎与单击项目或使用箭头键移动完全相同.

当我按箭头键或单击以选择一个项目时,它将突出显示该项目为蓝色并在其周围放置黑色边框.

当我只使用该select_set()方法时,它只将蓝色突出显示移动到所需的项目.黑色边框位于之前的项目周围.

这会导致问题,因为如果我随后通过按向上/向下箭头键移动我的选择,它将选择具有黑色边框的项目上方/下方的项目,而不是以蓝色突出显示的项目.

我的问题是,除了蓝色突出显示外,如何将黑色边框移动到正确的项目?

这是一个屏幕截图,显示蓝色突出显示和黑色边框不同步:

图像显示问题

这是一些可以重现问题的最小代码.我删除的实施end,page up以及page down,但你仍然可以通过选择比第一个其他任何元素用鼠标,然后按看出问题home.

from Tkinter import END, Listbox, Tk

top = Tk()

listbox = Listbox(top)
listbox.grid(row = 0, column = 0)
for item in ['First', 'Second', 'Third', 'Last']:
    listbox.insert(END, item)

def onKey(e):
    if e.keysym == 'Home':
        listbox.select_clear(0, END)
        listbox.select_set(0)

listbox.bind('<Key>', onKey)

top.mainloop()
Run Code Online (Sandbox Code Playgroud)

Hua*_*eng 5

问题是因为该函数Listbox.select_set(index)只选择您给出的索引项,蓝色突出显示您选择的项.您需要使用该功能Listbox.activate(index)激活您给出的索引项,然后黑色边框显示您激活的项目.

我已经尝试过你的代码了,我listbox.activate(0)在函数下添加了一行代码listbox.select_set(0).添加此行代码后,当用户按下时,蓝色突出显示和黑色边框将一起移动到第一个项目home.

  • 选择和激活(正如你在使用键盘导航时所指的那样)是完全独立的,这对于实现一些选择模式(特别是`extended`模式)是必要的.通常这留给Tk中的低级控制器代码; 你几乎不必在你自己的代码中关心这个细节. (2认同)