tkinter - 将事件传递给函数

时间:2014-04-13 07:50:06

标签: python tkinter

当我这样做时

def popup(event):
    menu.post(event.x_root, event.y_root)

'事件'由PyCharm突出显示并由python处理好。 当我做的时候

something.bind("<SomeKey>", foo(event,bar,INSERT))

&#39;事件&#39;没有突出显示,我得到例外:

NameError: name 'event' is not defined

这两者有何不同?如果python在第一种情况下隐式发现事件,为什么它不能再次执行相同的操作呢?

1 个答案:

答案 0 :(得分:1)

当你致电bind时,你必须给它一个可以在以后调用的东西的参考。您没有这样做 - 您在致电foo 时呼叫bind 。因为您正在调用该函数,所以当时变量event不存在,因此您会收到错误。

最好的办法是定义foo,这样你就不需要传递参数。从一般意义上来说,它本身并不是最好的,当你第一次学习Tkinter时最好。由于tkinter会自动传递一个事件对象,因此您需要它接受该参数,但您不需要明确地传递该参数。

例如:

def foo(event):
    global bar
    <do something with event, bar and INSERT>

something.bind("<SomeKey>", foo)

请注意bind语句中没有额外的括号。 foo 函数传递给bind命令,tkinter在调用foo时会自动包含一个事件对象。