尝试使方法在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没有定义。
答案 0 :(得分:1)
当您在bind()
中指定以括号结尾的函数时,它仅运行该函数而没有绑定生成事件。相反,您必须给绑定一个名称。您可以使用lambda
或functools.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()