
[英]Infinite loop or no action when binding <<ListboxSelect>>
[英]Binding method with multiple arguments to <<ListboxSelect>>
尝试使方法在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未定义。
当您在bind()
中指定一个以括号结尾的函数时,它仅运行该函数而没有bind生成事件。 相反,您必须给绑定一个名称。 您可以使用lambda
或functools.partial
完成此操作。 我将在示例中使用lambda。
Bind在触发时会生成一个事件,因此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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.