如何将所有框架小部件绑定到<'Enter'>事件

时间:2018-11-27 14:24:36

标签: python tkinter binding frame

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

true

3 个答案:

答案 0 :(得分: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


P.S。 <Enter>事件是不是事件,当您按下键盘上的 Enter 按钮(即<Return>)时触发该事件。每当您将鼠标移到窗口小部件上时,就会触发<Enter>事件,并且在您离开鼠标时将伴随<Leave>事件。这可能是您想要的,但通常会导致混乱。

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

如果有任何错误,我发现您在做错,很可能是您没有为Enter键调用写命令。希望,如果您尝试在Windows上执行此操作,则应该使用Return

更像:

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