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

Neo*_*nde 4 python listbox tkinter selection

我正在尝试从 a 选择多个项目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)
Run Code Online (Sandbox Code Playgroud)

fhd*_*sdg 9

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

\n
Listbox(..., selectmode=EXTENDED, ...)\n
Run Code Online (Sandbox Code Playgroud)\n

来自effbot

\n
\n

列表框通过selectmode选项提供四种不同的选择模式。这些是“单个”(仅一个选择)、“浏览”(相同,但可以使用鼠标移动选择)、“多个”(可以通过一次单击一个来选择多个项目)或“扩展”(多个项目范围)可以使用 Shift 和 Control 键盘修饰符进行选择)。默认是浏览。使用MULTIPLE获得 \xe2\x80\x9cchecklist\xe2\x80\x9d 行为,并在用户通常只选择一项但有时想要选择一个或多个项目范围时使用 EXTENDED 。

\n
\n
\n

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

\n