Tkinter列表框" selection_set"并且"激活"暂时禁用扩展选择

时间:2018-04-06 14:43:20

标签: python tkinter

可以使用Tkinter Listbox以允许选择多个项目,但selectmode配置。但是,如果我现在以编程方式选择并激活一个条目,然后使用shift键和向上或向下箭头键,则不会将选择扩展到当前上方/下方的项目,但它只会激活新的项目,同时保留旧的选择。

例如,在下面的(Python 2.7)代码中,我将Listbox子类化为允许Home和End键分别选择列表中的第一个和最后一个项目:

import Tkinter as tk

class MyListbox(tk.Listbox):
    def __init__(self, *args, **kwargs):
        tk.Listbox.__init__(self, *args, **kwargs)
        self.bind("<Home>", lambda *args: self.select(0))
        self.bind("<End>", lambda *args: self.select("end"))

    def select(self, index):
        self.select_clear(0, "end")
        self.selection_set(index)
        self.see(index)
        self.activate(index)

main = tk.Tk()
listbox = MyListbox(main, selectmode="extended")
for x in ["one", "two", "three", "four", "five"]:
    listbox.insert("end", x)
listbox.pack()

tk.mainloop()

这会生成一个带有列表框的窗口。如果选择列表框并单击&#34;结束&#34;,则选择最后一个元素(字符串&#34;五&#34;)。如果你现在按下Shift-Up,那么你会期望字符串&#34;四&#34;和&#34;五&#34;被选中。相反,&#34;四&#34;被激活(如预期)未被选中,&#34;五&#34;保持选中状态。

为什么&#34;四&#34;除了&#34;五&#34;之外没有被选中我可以在不必重新绑定箭头键和朋友的情况下解决这个问题吗?

请注意,如果我通过单击选择项目或使用箭头键导航到该项目,则不会会发生此行为。

1 个答案:

答案 0 :(得分:1)

您还需要在self.selection_anchor(index)方法中调用select来设置锚点

def select(self, index):
    self.select_clear(0, "end")
    self.selection_set(index)
    self.see(index)
    self.activate(index)
    self.selection_anchor(index)