如何在TKinter列表框中移动选择多个项目?

时间:2018-07-17 08:27:43

标签: python tkinter listbox selection

我正在尝试从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)

1 个答案:

答案 0 :(得分:2)

默认情况下,您似乎想要的行为 可用,请使用

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

来自effbot

  

列表框通过 selectmode 选项提供了四种不同的选择模式。它们是 SINGLE (单项选择), Browse (浏览)(相同,但是可以使用鼠标移动选择项), MULTIPLE (多项)可以一次单击一次来选择),也可以选择 EXTENDED (使用Shift和Control键盘修改器选择多个范围)。默认值为浏览。使用 MULTIPLE 来获得“清单”行为,并在用户通常只选择一项但有时希望选择一个或多个项目范围时使用 EXTENDED 。 >


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