由控制流调用的函数,而不是由tkinter绑定

时间:2014-03-23 07:49:26

标签: python tkinter

我有以下功能

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__方法来解决此问题?

2 个答案:

答案 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)))

http://effbot.org/zone/tkinter-callbacks.htm