tkinter - 将事件传递给函数

2 投票
1 回答
1884 浏览
提问于 2025-04-18 02:33

当我执行

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 时会自动包含一个事件对象。

撰写回答