当您创建绑定时bind
,Tkinter 自动添加一个包含事件信息的参数。您需要在您的rand_func
定义或你如何称呼它。
这个论点是not当您使用时包括command
属性。您必须在每种情况下如何调用函数或函数如何解释其参数时小心考虑此额外参数。
这是一种使用的解决方案lambda
仅在使用时才在绑定中接受额外的事件bind
命令,但不将其传递给最终命令。
import tkinter as tk
class 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()
话虽如此,绑定到框架很少是正确的做法。通常,框架不会有键盘焦点,除非它有焦点,否则绑定永远不会触发。如果您要设置全局绑定,您应该绑定到“all”绑定标签(使用bind_all方法)或顶级小部件。