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

时间:2015-04-19 02:59:34

标签: python tkinter listbox tk

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

使用箭头键一次滚动一个项目非常繁琐,因此我希望通过输入元素名称并使页面更快,允许用户更快地浏览列表 page down home end 工作。

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

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

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

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

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

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

Image showing the problem

这里有一些可以重现问题的最小代码。我删除了 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()

1 个答案:

答案 0 :(得分:5)

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

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