<p>这里绝对不需要使用<code>exec()</code>或<code>eval()</code>。你知道吗</p>
<ul>
<li>函数不必按顺序命名。也可以将函数对象存储在循环变量中,并使用该循环变量创建tkinter钩子。你知道吗</li>
<li>可以使用绑定参数创建函数,而不使用<code>exec</code>,也可以使用闭包,或者仅通过将参数绑定到lambda函数或<code>functools.partial()</code>。你知道吗</li>
</ul>
<p>因此,如果有一个循环具有递增的<code>strategicpoint</code>值,我就这样做:</p>
<pre><code>def set_strategy(point):
global strategy
strategy = point
buttons = []
for strategicpoint in range(1, number_of_points + 1):
imgx = tk.Button(win, image=towert, command=lambda point=strategicpoint: set_strategy(point))
buttons.append(imgx)
</code></pre>
<p><code>lambda point=...</code>部分将当前循环值绑定为<code>lambda</code>创建的新函数对象的<code>point</code>参数的默认值。如果在没有参数的情况下调用该函数(就像单击按钮时所做的那样),那么新函数将使用当时分配给<code>strategicpoint</code>的整数值来调用<code>set_strategy(point)</code>。你知道吗</p>
<p>您还可以使用闭包,即外部函数中的局部变量,内部函数可以使用它。每次调用外部函数时,都会创建外部函数中的嵌套内部函数,因此它们与由同一外部函数创建的其他函数对象是分开的:</p>
<pre><code>def create_strategy_command(strategypoint):
def set_strategy():
global strategy
strategy = strategypoint
return set_strategy
</code></pre>
<p>然后在创建按钮时,请使用:</p>
<pre><code>imgx = tk.Button(win, image=towert, command=create_strategy_command(strategicpoint))
</code></pre>
<p>注意,调用<code>create_strategy_command()</code>函数在这里返回一个新函数,用作button命令。你知道吗</p>