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

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

使用箭头键一次滚动一项很繁琐,因此,我想允许用户通过键入元素名称以及上一页,下一页,首页和结尾来更快地浏览列表。工作。

问题是,当我使用Listboxselect_set()方法时,它似乎没有执行与单击项目或使用箭头键移动相同的操作。

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

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

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

我的问题是,除了蓝色高光外,如何将黑色边框移至正确的项目?

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

这是一些重现此问题的最小代码。我删除了结束,向上翻页和向下翻页的实现,但是您仍然可以通过用鼠标选择除第一个元素以外的任何元素,然后按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()

python大神给出的解决方案

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

我已经尝试过您的代码,并且在函数listbox.activate(0)下添加了一行listbox.select_set(0)
添加此行代码后,当用户按下主屏幕时,蓝色突出显示和黑色边框将一起移至第一项。