tkinter - 将事件传递给函数
当我执行
def popup(event):
menu.post(event.x_root, event.y_root)
时,'event' 在 PyCharm 中被高亮显示,并且 Python 也能正常处理它。
但是当我执行
something.bind("<SomeKey>", foo(event,bar,INSERT))
时,'event' 没有被高亮显示,我却遇到了一个异常:
NameError: name 'event' is not defined
这两者有什么不同呢?如果在第一种情况下 Python 能隐式找到 'event',那为什么在第二种情况下就不能了呢?
1 个回答
1
当你使用 bind
的时候,必须给它一个可以在以后调用的东西。你现在做的不是这样——你是在调用 foo
,而且是在调用 bind
的时候就已经调用了它。因为你在那个时候就调用了这个函数,所以变量 event
还不存在,这就导致了错误。
最好的做法是定义 foo
,让它不需要传入参数。这样做并不是说在所有情况下都是最好的,只是对于刚开始学习 Tkinter 的时候来说是最合适的。因为 tkinter 会自动传递一个事件对象,所以你需要让 foo
接受这个参数,但你不需要显式地传递这个参数。
举个例子:
def foo(event):
global bar
<do something with event, bar and INSERT>
something.bind("<SomeKey>", foo)
注意在 bind
语句中没有多余的括号。foo
这个 函数 被传递给了 bind
命令,而 tkinter 在调用 foo
时会自动包含一个事件对象。