将具有多个参数的绑定方法绑定到<< listboxselect >>

时间:2019-03-11 19:51:31

标签: python-3.x tkinter

尝试使方法在tkinter列表框中选择一个项目时执行。我可以使用.bind("<<ListboxSelect>>", method)绑定一些函数,但是如果我尝试给它提供任何参数,例如method(argumentone, argumenttwo),则该方法将不再在从列表框中选择一个项目时执行。但是,它在Mainloop启动时在启动时执行。此外,为方法提供参数是有问题的,因为我无法将已经传递给任何绑定方法的事件参数传递给它,因为它没有事先分配给任何变量。我希望能够将事件和另一个变量理想地传递给某种方法。在实现这一目标方面的任何帮助将非常欢迎。一些我想要实现的示例代码

def onSelection(event, foo):
    widget = event.widget
    print(widget.curselection())
    print(foo)


sam = "sam"
chars = Listbox(main)
chars.insert(someList)
chars.bind("<<ListboxSelect>>", onSelection(evt, sam))

请注意,此代码无效。 evt没有定义。

1 个答案:

答案 0 :(得分:1)

当您在bind()中指定以括号结尾的函数时,它仅运行该函数而没有绑定生成事件。相反,您必须给绑定一个名称。您可以使用lambdafunctools.partial完成此操作。我将在示例中使用lambda。

绑定在触发时会生成一个事件,因此lambda必须将其用作输入。然后使用所需的参数调用onSelection()

from tkinter import *

main = Tk()

def onSelection(event, foo):
    widget = event.widget
    print(widget.curselection())
    print(foo)

someList = ['Stilton', 'Brie', 'Edam', 'Cheddar', 'Ilchester']

chars = Listbox(main)
chars.pack(padx=10, pady=10)
for item in someList:
    chars.insert("end", item)

sam = "sam"
chars.bind("<<ListboxSelect>>", lambda event: onSelection(event, sam))
# Take care of event created by bind ----^                    ^
# Pass the event as well as argument to callback function ----|

main.mainloop()