<p>请考虑以下代码:</p>
<pre><code>b = Button(admin, text='as', command=button('hey'))
</code></pre>
<p>它的作用与此完全相同:</p>
<pre><code>result = button('hey')
b = button(admin, text='as', command=result)
</code></pre>
<p><code>command</code>选项接受对函数的引用,这是一种奇特的方式,表示您需要将函数的名称传递给它。若要传递引用,必须仅使用名称,而不使用括号或参数。例如:</p>
<pre><code>b = Button(... command = button)
</code></pre>
<p>如果要传递诸如“嘿”之类的参数,必须使用一些额外的代码:</p>
<ul>
<li>您可以创建一个中间函数,它可以在不使用参数的情况下调用,然后调用<code>button</code>函数</li>
<li>您可以使用<code>lambda</code>创建称为<em>匿名函数</em>的函数。从各个方面来说,它都是一个函数,只是没有名字。当您调用<code>lambda</code>命令时,它会返回对已创建函数的一个<em>引用</em>,这意味着它可以用于按钮的<code>command</code>选项的值。</li>
<li>你可以使用<a href="https://docs.python.org/2/library/functools.html#functools.partial" rel="noreferrer">functools.partial</a></li>
</ul>
<p>对我来说,<code>lambda</code>是最简单的,因为它不需要像<code>functools.partial</code>那样的任何额外导入,尽管有些人认为<code>functools.partial</code>更容易理解。</p>
<p>要创建用参数调用<code>button</code>函数的lambda函数,请执行以下操作:</p>
<pre><code>lambda: button('hey')
</code></pre>
<p>最终得到的函数在功能上等同于:</p>
<pre><code>def some_name():
button('hey')
</code></pre>
<p>如前所述,<code>lambda</code>返回对这个无名函数的引用。由于引用是<code>command</code>选项所期望的,因此可以在创建按钮时直接使用<code>lambda</code>:</p>
<pre><code>b = Button(... command = lambda: button('hey'))
</code></pre>
<p>总的来说,这个网站上有一个关于lambda的问题,有很多有趣的评论。见问题<a href="https://stackoverflow.com/questions/890128/why-python-lambdas-are-useful">Why Python lambdas are useful?</a>。当需要向回调传递变量时,同样的讨论也有<a href="https://stackoverflow.com/questions/890128/python-lambda-why/5771855#5771855">an answer that shows how to use lambdas in a loop</a>。</p>
<p>最后,请参阅标题为<a href="http://effbot.org/zone/tkinter-callbacks.htm" rel="noreferrer">Tkinter Callbacks on effbot.org</a>的部分,以获得一个不错的教程。lambda的覆盖范围很小,但是那里的信息可能仍然有用。</p>