Python Tkinter列表框';s";选择“U集”;及;激活";暂时禁用扩展选择

Python Tkinter列表框';s";选择“U集”;及;激活";暂时禁用扩展选择,python,tkinter,Python,Tkinter,通过选择模式配置,可以创建一个Tkinter列表框,以允许选择多个项目。但是,如果我现在以编程方式选择并激活一个条目,那么结合使用shift键和向上或向下箭头键不会将选择扩展到当前项之上/之下的项,但它只激活该新项,同时保留旧的选择 例如,在以下(Python 2.7)代码中,我将子类化Listbox,以允许Home键和End键分别选择列表中的第一项和最后一项: import Tkinter as tk class MyListbox(tk.Listbox): def __init__

通过
选择模式
配置,可以创建一个Tkinter
列表框
,以允许选择多个项目。但是,如果我现在以编程方式选择并激活一个条目,那么结合使用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()
将Tkinter作为tk导入
类MyListbox(tk.Listbox):
定义初始化(self,*args,**kwargs):
tk.Listbox.\uuuuu初始化(self,*args,**kwargs)
self.bind(“,lambda*args:self.select(0))
self.bind(“,lambda*args:self.select(“end”))
def选择(自我,索引):
自行选择清除(0,“结束”)
自选择集(索引)
self.see(索引)
自我激活(索引)
main=tk.tk()
listbox=MyListbox(main,selectmode=“extended”)
对于[“一”、“二”、“三”、“四”、“五”]中的x:
列表框。插入(“结束”,x)
listbox.pack()
tk.mainloop()
这将生成一个包含列表框的窗口。如果选择列表框并点击“结束”,则选择最后一个元素(字符串“五”)。如果现在按Shift Up键,则希望选择字符串“4”和“5”。相反,“四”被激活(如预期)而未被选中,“五”保持选中状态

为什么除了“五”之外“四”没有被选中?我可以不用重新绑定箭头键和朋友就解决这个问题吗

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

您还需要通过调用
self.selection\u 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)