【发布时间】:2015-06-25 20:17:08
【问题描述】:
我正在使用 Tkinter GUI 编写一个应用程序,其中包含我希望可以通过键盘访问的长列表框。
使用箭头键一次滚动一个项目很乏味,所以我想让用户通过输入元素的名称来更快地浏览列表,同时也使 page up kbd>、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()
【问题讨论】: