<p>实际上,<a href="https://stackoverflow.com/questions/53501843/how-to-bind-all-frame-widgets-to-enter-event#comment93873371_53501843">comment made by Lafexlos</a>给了你正确的方向。当你这么做的时候</p>
<pre><code>w.bind('<Enter>', canvas1.focus_set())
</code></pre>
<p>调用<code>canvas1.focus_set()</code>,并使用此函数调用的返回值(即<code>None</code>)绑定到事件。这不是您想要的,因为现在每次触发事件时,都会执行<code>None</code>,而不是<code>canvas1.focus_set()</code>。你知道吗</p>
<p>您应该做的是将函数引用传递给<code>bind</code>函数。调用<code>canvas1.focus_set()</code>的引用是<code>canvas1.focus_set</code>。但是,使用</p>
<pre><code>w.bind('<Enter>', canvas1.focus_set)
</code></pre>
<p>还是不行。<br/>
这是因为<code>bind</code>函数将事件对象传递给给定的函数,因此它将调用<code>canvas1.focus_set(event)</code>,而不是<code>canvas1.focus_set()</code>。因为<code>focus_set</code>不接受任何参数,所以失败。你知道吗</p>
<p>你可以用两种方法来解决这个问题。您可以创建一个额外的函数,它接受一个事件对象,然后不带参数地调用<code>canvas1.focus_set()</code>,然后将事件绑定到这个新函数。另一种选择是使用匿名的“lambda”函数来实现基本相同的功能</p>
<pre><code>w.bind('<Enter>', lambda e: canvas1.focus_set())
</code></pre>
<p>这样,lambda函数将事件对象作为<code>e</code>接受,但不将其传递给<code>focus_set</code>。你知道吗</p>
<hr/>
<p>另外,<code><Enter></code>事件是<strong>而不是</strong>当您按下键盘上的<kbd>回车</kbd>按钮(即<code><Return></code>)时触发的事件。每当您将鼠标移到小部件上时,<code><Enter></code>事件就会触发,当您将小部件与鼠标一起离开时,<code><Leave></code>事件也会随之触发。这可能是你想要的,但它常常导致混乱。你知道吗</p>