如何在TKinter的列表框中进行多项选择?

3
我正在尝试从 Listbox 选择多个项目,按住 shift 然后选择并选中一系列项目似乎很直观,但是在 Tkinter 中似乎没有内置的此功能。因此,我正在尝试实现它,通过注册 shift 键并获取最新的选择来完成。但是,在尝试确定 Listbox 中最新选择时卡住了。 listbox.get(ACTIVE) 看起来比我预期的要慢一步。
这是我到目前为止尝试做的事情,我知道当我知道最新的选择时需要做更多的工作,但那会稍后再来处理。
from Tkinter import *

class GUI():
    def __init__(self,frame): # Some Init
        self.listbox = Listbox(root, height=20, width=51, selectmode=MULTIPLE, exportselection=0, yscrollcommand=yscrollbar.set, xscrollcommand=xscrollbar.set)
        # -- Some Grid setup here --
        self.listbox.bind("<<ListboxSelect>>", self.selectionCallback)
        frame.bind("<Shift_L>", self.shiftCallback)
        frame.bind("<KeyRelease-Shift_L>", self.shiftCallback)

    def selectionCallback(self,event):
        print self.listbox.get(ACTIVE) # This is where im stuck

    def shiftCallback(self,event):
        if event.type is 2: #KeyPress
            self.shift = True
        elif event.type is 3: #KeyRelease
            self.shift = False

if __name__ == "__main__":
    root = Tk()
    GUI(root)

3
我认为 selectmode=EXTENDED 是你要找的。 - fhdrsdg
1个回答

8
你想要的行为实际上是默认情况下可用的。使用:

Listbox(..., selectmode=EXTENDED, ...)

effbot了解到:

列表框通过 selectmode 选项提供四种不同的选择模式。 它们是 SINGLE (仅一项选择), BROWSE (相同,但可以使用鼠标移动选择), MULTIPLE (可以通过单击一个接一个地选择多个项目),或 EXTENDED (可以使用Shift和Control键盘修改器选择多个项目范围)。 默认值为 BROWSE 。 使用 MULTIPLE 以获得“检查表”行为,并在用户通常只选择一项但有时会选择一个或多个项目范围时使用 EXTENDED


至于 listbox.get(ACTIVE)ACTIVE 是下划线的那个。 您可以看到,这仅在释放鼠标按钮时更新。 因为鼠标按下时触发了 <<ListboxSelect>> 事件,所以您会得到先前选择的项目,因为 ACTIVE 尚未更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接