我有以下功能
def insert_word(listbox,text):
t_start.insert(INSERT, text)
print "worked"
绑定到"<返回>"密钥通过
listbox.bind("<Return>", insert_word(t_start,listbox.get(ACTIVE)))
为什么在控制流来时调用函数,而不是在按Return键时? 什么是绑定函数背后的整个想法,如果它可以以其他方式触发然后绑定本身?
我是否需要使用__init__
和__call__
方法来解决此问题?
答案 0 :(得分:3)
调用该函数是因为实际上是在调用它。
listbox.bind("<Return>", insert_word(t_start,listbox.get(ACTIVE)))
# ^----this function call is evaluated---^
您要做的是为回调提供一个回调,即一个函数对象。您可以使用闭包来做到这一点。
def callback(t_start, text):
def inner():
t_start.insert(INSERT, text)
return inner # Return the function
listbox.bind("<Return>", callback(t_start, listbox.get(ACTIVE)) )
# ^----this call returns a function----^
# Be aware that ^--this parameter-^ is
# still evaluated when the interpreter
# evaluates the statement
触发事件时将调用回调函数。
答案 1 :(得分:2)
就像@ddelemeny所说的那样,该函数将在编写时被调用。如果您的程序是按类构造的,那么通常不需要传递参数,因为您可以直接从函数中与变量进行交互。但是,对于您的情况,一个简单的解决方案是使用lambda
表达式,因此当控制流到达时,Python不会调用回调函数。
listbox.bind("<Return>", lambda e: insert_word(t_start,listbox.get(ACTIVE)))