繁体   English   中英

将多个参数绑定到&lt; <ListboxSelect> &gt;

[英]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生成事件。 相反,您必须给绑定一个名称。 您可以使用lambdafunctools.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM