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

Tkinter Listbox highlights one element in blue, but puts black border around another?

我正在编写一个带有 Tkinter GUI 的应用程序,其中包含我希望可以通过键盘访问的长列表框。

使用箭头键一次滚动一个项目是乏味的,所以我想让用户更快地浏览列表,方法是输入元素的名称,并使 向上翻页向下翻页主页结束工作。

问题是,当我使用 Listboxselect_set() 方法时,它所做的事情似乎与单击某个项目或使用箭头键移动所做的事情完全不同。

当我按箭头键或单击 select 一个项目时,它会以蓝色突出显示该项目并在其周围加上黑色边框。

当我只使用 select_set() 方法时,它只会将蓝色突出显示移动到所需的项目。黑色边框留在项目周围。

这会导致问题,因为如果我随后通过按 up/down 箭头键移动我的 selection,它将 select 项目 above/below带有黑色边框的项目,而不是以蓝色突出显示的项目。

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

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

这里有一些重现问题的最小代码。我删除了 endpage uppage down 的实现,但您仍然可以看到select 用鼠标点击第一个元素以外的任何元素,然后按 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()

问题是因为函数Listbox.select_set(index)只是select你给出的索引项,蓝色高亮显示你select是哪个项。 您需要使用函数Listbox.activate(index)来激活您给的索引的item,然后黑框显示您激活的是哪个item。

我试过你的代码,我在函数listbox.select_set(0)下面添加了一行listbox.activate(0)。 添加这行代码后,当用户按下 home.

时,蓝色高亮和黑色边框将一起移动到第一项。