首页 > 解决方案 > 如何在 TKinter 列表框中移动选择多个项目?

问题描述

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

标签: pythontkinterlistboxselection

解决方案


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

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

来自effbot

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


至于listbox.get(ACTIVE),那项ACTIVE就是带下划线的那一项。您可以看到这仅在释放鼠标按钮时更新。因为<<ListboxSelect>>事件是在鼠标按下时触发的,所以你会得到之前选择的项目,因为它还ACTIVE没有更新。


推荐阅读