Python 更改Tkinter列表框选择时获取回调?

Python 更改Tkinter列表框选择时获取回调?,python,events,tkinter,Python,Events,Tkinter,当Tkinter中的文本或条目小部件发生更改时,有很多方法可以获取回调,但我还没有找到一种方法用于Listbox,因为我能找到的大部分事件文档都是旧的或不完整的。是否有办法为此生成事件?您可以绑定到该事件。每当选择发生更改时,无论是通过按钮单击、键盘或任何其他方法更改,都将生成此事件 下面是一个简单的示例,每当您从列表框中选择某个内容时,都会更新标签: import tkinter as tk root = tk.Tk() label = tk.Label(root) listbox = tk

当Tkinter中的文本或条目小部件发生更改时,有很多方法可以获取回调,但我还没有找到一种方法用于Listbox,因为我能找到的大部分事件文档都是旧的或不完整的。是否有办法为此生成事件?

您可以绑定到该事件。每当选择发生更改时,无论是通过按钮单击、键盘或任何其他方法更改,都将生成此事件

下面是一个简单的示例,每当您从列表框中选择某个内容时,都会更新标签:

import tkinter as tk

root = tk.Tk()
label = tk.Label(root)
listbox = tk.Listbox(root)
label.pack(side="bottom", fill="x")
listbox.pack(side="top", fill="both", expand=True)

listbox.insert("end", "one", "two", "three", "four", "five")

def callback(event):
    selection = event.widget.curselection()
    if selection:
        index = selection[0]
        data = event.widget.get(index)
        label.configure(text=data)
    else:
        label.configure(text="")

listbox.bind("<<ListboxSelect>>", callback)

root.mainloop()

该事件在规范中提到。所有预定义的虚拟事件都可以在上找到。

我遇到的问题是,我需要在selectmode=MULTIPLE的列表框中获取最后一个选定的项目。如果其他人也有同样的问题,以下是我所做的:

lastselectionList=[] def onselectevt: 请注意,Tkinter将事件对象传递给onselect 全局lastselectionList w=evt.widget if lastselectionList:if非空 将上一个selectionlist与新列表进行比较并提取差异 changedSelection=setlastselectionList.symmetric_differencesetw.CursSelection lastselectionList=w 其他: 如果为空,则指定当前选择 lastselectionList=w changedSelection=w changedSelection应该始终是一个只有一个条目的集合,因此我们可以将其转换为lst并提取第一个条目 索引=intlistchangedSelection[0] 值=w.getindex tkinter.messagebox.ShowInfo您选择的,值 listbox=tk.Listboxframe,selectmode=tk.MULTIPLE listbox.bind,onselect listbox.pack
太好了,谢谢。知道在哪里可以找到Widget支持的所有自定义事件的文档吗?@RobotGymnast尝试Tcl/Tk手册页[来自Bill下面的答案或要点,但这只打印所选项目中的第一个。如果您有多个选择,请尝试打印“您选择的项目:%s”%[w.getinti for I in w.curselection]在Python 3.6.5中,intw.curselection[0]可以替换为w.curselection[0],因为它已返回int类型的对象。请注意,我没有在任何其他Python版本中尝试此操作。所有虚拟事件都列在:页。
def onselect(evt):
    # Note here that Tkinter passes an event object to onselect()
    w = evt.widget
    index = int(w.curselection()[0])
    value = w.get(index)
    print 'You selected item %d: "%s"' % (index, value)

lb = Listbox(frame, name='lb')
lb.bind('<<ListboxSelect>>', onselect)