【问题标题】:How to bind all frame widgets to <'Enter'> event如何将所有框架小部件绑定到 <'Enter'> 事件
【发布时间】:2019-04-29 07:43:27
【问题描述】:

下面的代码我想将所有frame1项绑定到事件,但它不起作用。我的意思是 canvas.focus_set() 没有生效。我该如何解决我的问题?

for w in frame1.winfo_children():
    w.bind('<Enter>',canvas1.focus_set())

【问题讨论】:

标签: python tkinter binding frame


【解决方案1】:

comment made by Lafexlos 实际上将您发送到正确的方向。当你这样做

w.bind('<Enter>', canvas1.focus_set())

您调用canvas1.focus_set() 并使用此函数调用的返回值(即None)绑定到事件。这不是您想要的,因为现在每次触发事件时,都会执行 None 而不是 canvas1.focus_set()

您应该做的是将函数引用传递给bind 函数。调用canvas1.focus_set() 的参考是canvas1.focus_set。但是,使用

w.bind('<Enter>', canvas1.focus_set)

还是不行。
这是因为bind 函数将一个事件对象传递给它已被赋予的函数,因此它将调用canvas1.focus_set(event) 而不是canvas1.focus_set()。因为focus_set 不接受任何参数,所以失败。

您可以通过两种方式解决此问题。你可以做一个额外的函数,它接受一个事件对象,然后不带参数调用canvas1.focus_set(),然后将事件绑定到这个新函数。另一种选择是使用匿名“lambda”函数基本上做同样的事情

w.bind('<Enter>', lambda e: canvas1.focus_set())

这样,lambda 函数将事件对象作为e 接受,但不会将其传递给focus_set


附: &lt;Enter&gt; 事件不是当您按下键盘上的 Enter 按钮(即&lt;Return&gt;)时触发的事件。 &lt;Enter&gt; 事件会在您将鼠标移到小部件上时触发,并伴随着&lt;Leave&gt; 事件用于当您用鼠标离开小部件时。这可能是你想要的,但它经常会导致混乱。

【讨论】:

    【解决方案2】:

    通过使用 frame1 的父级 canvas1.bind_all 我解决了我的问题。感谢所有解决方案。

    【讨论】:

      【解决方案3】:

      如果我看到你犯了任何错误,很可能你没有调用Enter 键的写入命令。希望如果您尝试在 Windows 上执行此操作,您应该使用Return

      更像:

      for w in frame1.winfo_children():
          w.bind('<Return>',canvas1.focus_set())
      

      【讨论】:

      • 为什么投反对票? Enter 在你自己的 Windows 机器上工作吗?嗯?
      • 使用Return 而不是focus_set(),您应该绑定到您创建的函数,如@Lafexlos 前面所述
      • &lt;Enter&gt; 实际上是一个有效事件,每当您使用鼠标输入小部件时都会触发该事件。你说得对,&lt;Return&gt; 是按下 Enter 按钮的事件,但是从问题中不清楚这是否是 OP 想要的。
      • 通过使用 frame1 的父级 canvas1.bind_all 我解决了我的问题。感谢所有解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多