Tkinter Listbox 以蓝色突出显示一个元素,但在另一个元素周围放置黑色边框?
Posted
技术标签:
【中文标题】Tkinter Listbox 以蓝色突出显示一个元素,但在另一个元素周围放置黑色边框?【英文标题】:Tkinter Listbox highlights one element in blue, but puts black border around another? 【发布时间】: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()
【问题讨论】:
【参考方案1】:问题是因为函数Listbox.select_set(index)
只是选择了你给的索引的项目,蓝色高亮显示你选择了哪个项目。
你需要使用函数Listbox.activate(index)
来激活你给的索引的item,然后黑色边框显示你激活的是哪个item。
我已经尝试过你的代码,我在函数listbox.select_set(0)
后面添加了一行listbox.activate(0)
。
添加这行代码后,当用户按home时,蓝色高亮和黑色边框会一起移动到第一项。
【讨论】:
正要发布这个 - 你比我早了 2 分钟。 :) 选择和激活(这是您在使用键盘导航时所指向的正式内容)是完全独立的,这是实现某些选择模式所必需的(尤其是extended
模式)。通常这留给 Tk 中的低级控制器代码;您几乎不必在自己的代码中关心这些细节。
太好了,谢谢!我实际上在我的文档中看到了这种方法,但是他们对activated
元素的描述是带下划线的,而不是被黑框包围的,所以我没想尝试。他们也懒得描述为什么activated
元素很重要。你碰巧有比这更好的文档吗:effbot.org/tkinterbook/listbox.htm?
另外一件小事 - 我需要在 listbox.see(0)
下方的 listbox.activate(0)
行中添加。在我只有 4 个元素的最小复制中没有必要,但在我的完整程序中可以有任意数量的元素(我的测试数据源之一有 400 个元素)。如果没有该行,您可以选择并激活该元素,但实际上看不到它。
@ArtofWarfare 谢谢!我没有注意到这个问题。以上是关于Tkinter Listbox 以蓝色突出显示一个元素,但在另一个元素周围放置黑色边框?的主要内容,如果未能解决你的问题,请参考以下文章