python - 如何在 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)
解决方案
默认情况下,您似乎想要的行为实际上是可用的,请使用
Listbox(..., selectmode=EXTENDED, ...)
来自effbot:
列表框通过selectmode选项提供四种不同的选择模式。它们是SINGLE(只是一个选择)、BROWSE(相同,但可以使用鼠标移动选择)、MULTIPLE(可以选择多个项目,一次单击一个)或EXTENDED(多个项目范围)可以使用 Shift 和 Control 键盘修饰符进行选择)。默认值为BROWSE。使用MULTIPLE获得“清单”行为,并在用户通常只选择一项,但有时想选择一个或多个项目范围时使用EXTENDED 。
至于listbox.get(ACTIVE)
,那项ACTIVE
就是带下划线的那一项。您可以看到这仅在释放鼠标按钮时更新。因为<<ListboxSelect>>
事件是在鼠标按下时触发的,所以你会得到之前选择的项目,因为它还ACTIVE
没有更新。
推荐阅读
- c# - C# WebRequest 400 错误在尝试使用 firebase 获取 orderBy 时,在没有 orderby 的情况下工作正常
- vba - 根据条件复制行范围 vba 和标题行
- azure - Azure 机器人框架 - 连接打开和关闭
- html - MIME-电子邮件图像在 iphone 上显示为可点击的框
- php - laravel 5.6 发票管理器 - 调用字符串上的成员函数 count()
- flask - Gevent pywsgi 服务器与 gunicorn 一起使用?
- ruby-on-rails-4 - default_scope 轨道替代
- javascript - Woocommerce - 根据一天中的时间禁用某些运输方式
- getstream-io - 一种在不阅读通知提要的情况下将通知标记为已见的方法?
- azure - 从 Azure Active Directory 获取订阅的 TenanId