Python中为什么在声明时执行Button参数“ command”?

发布于 2021-02-02 23:24:56

代码是:

from Tkinter import *

admin = Tk()
def button(an):
    print an
    print 'het'

b = Button(admin, text='as', command=button('hey'))
b.pack()
mainloop()

该按钮不起作用,它在没有我的命令的情况下打印了“hey”和“ het”一次,然后,当我按下按钮时,什么也没发生。

关注者
0
被浏览
434
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    考虑以下代码:

    b = Button(admin, text='as', command=button('hey'))
    

    它的功能与此完全相同:

    result = button('hey')
    b = button(admin, text='as', command=result)
    

    command选项引用了一个函数,这是你需要向其传递函数名称的一种奇特的方式。要传递引用,你必须仅使用名称,而不使用括号或参数。例如:

    b = Button(... command = button)
    

    如果要传递诸如“her”之类的参数,则必须使用一些额外的代码:

    • 你可以创建一个无需你的参数即可调用的中间函数,然后再调用你的button函数,
    • 你可以lambda用来创建所谓的匿名函数。在各种方面,它都是一个函数,但没有名称。当你调用lambda命令时,它返回对创建的函数的引用,这意味着它可以用作command按钮选项的值。
    • 你可以使用functools.partial
      对我来说,这lambda是最简单的,因为它不需要像functools.partial这样的任何其他导入,尽管有些人认为这functools.partial更容易理解。

    要创建一个button使用参数调用你的函数的lambda函数,你可以执行以下操作:

    lambda: button('hey')
    

    你最终得到的功能在功能上等同于:

    def some_name():
        button('hey')
    

    如前所述,lambda返回对该无名函数的引用。由于参考是该command选项所期望的,因此你可以lambda直接在按钮的创建中使用它:

    b = Button(... command = lambda: button('hey'))
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看