使用创建绑定时
bind,Tkinter会自动添加一个包含有关事件信息的参数。您需要在
rand_func定义或调用方式中考虑这一点。
使用属性时 不 包括此参数
command。在每种情况下如何调用函数或函数如何解释其参数时,必须小心考虑这个额外的参数。
这是一种
lambda在绑定中使用的解决方案,仅在使用
bind命令时才接受额外事件,而不将其传递给最终命令。
import tkinter as tkclass SampleApp(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) self.frame = tk.frame(self) self.frame.pack() self.button = tk.Button(self.frame, text="click me", command=lambda a=1, b=2, c=3:self.rand_func(a, b, c)) self.button.pack() self.frame.bind("<Return>", lambda event, a=10, b=20, c=30: self.rand_func(a, b, c)) # make sure the frame has focus so the binding will work self.frame.focus_set() def rand_func(self, a, b, c): print "self:", self, "a:", a, "b:", b, "c:", c print (a+b+c)app = SampleApp()app.mainloop()话虽如此,绑定到框架很少是正确的事情。通常,框架不会具有键盘焦点,并且除非具有焦点,否则绑定永远不会触发。如果要设置全局绑定,则应绑定到“所有”绑定标签(使用bind_all方法)或顶级小部件。



