<p>{a1}</p>
<p><a href="http://stupidpythonideas.blogspot.com/2013/05/why-you-dont-want-to-dynamically-create.html" rel="nofollow">And creating variables dynamically is almost always the wrong thing to do.</a></p>
<p>而你的问题让它运作起来就是一个完美的例子。在</p>
<hr/>
<p>只需创建一个<code>dict</code>映射名称到按钮:</p>
<pre><code>buttons = {}
# ...
letter = alphabet[i]
buttons[letter] = Button(frame, text = letter, command = letterAction(letter))
buttons[letter].place(x = x, y = y, width = width, height = height)
</code></pre>
<p>如果您真的想将<code>dict</code>转储到<code>locals()</code>(或者,类似地,<code>self.__dict__</code>或{<cd6>}或…),那么这很简单。但是你没有,你只需要在你的<code>letterAction</code>函数中使用变量。所以:</p>
^{pr2}$
<hr/>
<p>但请注意,这样做是错误的。<code>command = letterAction(letter)</code>-无论是直接运行还是通过<code>exec</code>-现在都要调用<code>letterAction(letter)</code>,在创建之前销毁按钮,并返回{<cd11>},然后将其设置为<code>command</code>。在</p>
<p>您需要<code>lambda: letterAction(letter)</code>或<code>partial(letterAction, letter)</code>来修复此问题。在</p>
<p>另外,现在或以后都不能编写代码将button变量本身传递给<code>letter</code>,因为该变量还不存在。你必须将字母<em>作为字符串传递,就像我上面所做的那样。在</p>
<hr/>
<p>但实际上,如果你仔细想想,你根本不需要这些按钮变量,不管是在<code>dict</code>中还是在其他地方。你只需要一种方法将每个按钮绑定为它自己的回调目标,对吧?有很多方法可以做到这一点,但最明显的一种方法是类,要么继承或委托给<code>Button</code>(或者,在本例中,既不需要将其用作按钮,也不需要在创建后记住它)。在</p>
<p>当我们在做的时候,让我们去掉一些无关的parens之类的东西,这样会使东西更难阅读,并解决<code>17</code>似乎属于两个不同的组的问题</p>
<pre><code>class SelfDestructiveButton(object):
def __init__(self, frame, letter, x, y, width, height):
self.button = Button(frame, text=letter, command=self.command)
self.button.place(x=x, y=y, width=width, height=height)
def command(self):
self.button.destroy()
def createLetters(frame, startX, startY, width, height, spacing):
for i, letter in enumerate(string.ascii_uppercase):
if 9 <= i <= 17:
y = startY + height + 2 * spacing
x = startX + ((width + spacing) * (i - 9))
elif i > 17:
y = startY + 2 * height + 3 * spacing
x = (width + spacing) / 2 + startX + ((width + spacing) * (i - 18))
else:
y = startY + spacing
x = startX + ((width + spacing) * i)
SelfDestructiveButton(frame, letter, x, y, width, height)
</code></pre>
<p>使用<code>if 'J' <= letter <= 'R'</code>可能会更清楚,因为调试它时您将看到的是字母而不是数字。在</p>