Python GUI编程-1.5 lambda回调处理器

调用Python的lambda表达式会在运行时生成新的、未命名的函数对象。如果我们需要将其他传入的数据传递给处理器参数,就可以用lambda表达式延迟对处理器函数的调用,在此期间设定他需要的其他数据。

先来看一段代码:

from tkinter import *
widget = Button(None, text="Hello world!", command=(lambda: print("Hello Lambda!") or sys.exit()))
widget.pack()
widget.mainloop()

这段代码有些问题,因为lambda只能含有一个表达式。为了模拟原始脚本,该段代码强制用了一个or运算符来添加另一个表达式。

更多的情况下,lambda用来提供一个间接层,向回调处理器传递额外数据:

from tkinter import *


def handler(text):
    print(text)
    root.quit()
    

root = Tk()
Button(root, text="Hello world!", command=(lambda:handler("Hello Lambda!"))).pack()
root.mainloop()
尽管tkinter启动command回调时没有使用参数,这样的一个lambda表达式可以用来提供一个间接的匿名函数,该函数可以将正在的处理器回调屏蔽起来,同事传递GUI建立是的信息。在效果上对真正处理器的回调延迟了,于是我们可以添加它需要的参数。这里字符串“Hello Lambda”传递给参数text,tkinter自身运行回调时却不带参数。这样产生的效果是lambda将一个不带参数的函数调用映射到另一个lambda提供的参数上了。如果感觉到困惑,可以使用def声明替代。如下:

from tkinter import *


def handler(text):
    print(text)
    root.quit()
    
    
def func():
    handler("Hello Lambda!")


root = Tk()
Button(root, text="Hello world!", command=func()).pack()
root.mainloop()

这段代码起到了与上一段代码实际是等同的,在按钮的创建函数中指向了第二个函数,可以有效地延迟对真正回调处理器的调用,这样额外的参数就可以传递了。

延迟的必要性在域如果在按钮创建函数中编写处理器调用,而没有采用lambda或其他中间函数,回调会发生在按钮创建时,而不是之后按钮被按下时。如果还是不理解的话,可以按我说的理解:通俗一点说就是如果不加lambda,root.quit()这个函数无论你按不按退出按钮它都已经在窗口创建时调用了,而加了lambda后,root.quit()这个函数只有在你按退出按钮时调用。不知道这样说你们明白不明白。

创立中间函数也会起到l采用ambda的效果,只不过这样的话函数会相对较长而且比较不方便。我们只需要无参数的lambda或者无参数的可调用引用,而不是两者都需要。来看一下下面一段代码:

from tkinter import *


def handler(text):
    print(text)
    root.quit()
    
    
def func():
    handler("Hello Lambda!")


root = Tk()
Button(root, text="Hello world!", command=(lambda:func())).pack()
root.mainloop()
这里虽然采用了lambda,但是没有在lambda表达式中传入额外的参数,只是简单地调用韩式,增加了一个无意义的调用,编写这样一个lambda表达式是没有多大意义的。

你可能感兴趣的:(python)