【问题标题】:How can I shift select multiple items in TKinter listbox?如何在 TKinter 列表框中移动选择多个项目?
【发布时间】:2018-12-24 20:57:33
【问题描述】:

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

【问题讨论】:

  • 我认为selectmode=EXTENDED 是你要找的东西
  • 谢谢@fhdrsdg 你能把它作为一个答案,以便我可以将其标记为最佳答案吗?

标签: python tkinter listbox selection


【解决方案1】:

你似乎想要的行为实际上默认可用的,使用

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

来自effbot

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


对于listbox.get(ACTIVE)ACTIVE 的项目是带下划线的项目。您可以看到这仅在释放鼠标按钮时更新。因为&lt;&lt;ListboxSelect&gt;&gt;事件是在鼠标按下时触发的,所以你得到了之前选择的项目,因为ACTIVE还没有更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 2017-11-09
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多