【问题标题】:Keybind causes function to run automatically on startup键绑定导致功能在启动时自动运行
【发布时间】:2020-10-18 00:54:52
【问题描述】:

我正在尝试为我的Entry 创建一个键绑定,它获取用户在Entry 中输入的内容,然后调用一个函数。

我的代码:

def nameValidation(name):
    if PresenceCheck(name) and LengthCheck(name,2) and DataTypeCheck(name,str):
        print("Valid Name")
    else:
        nameEntry.configure(bg="red")
nameEntry = tk.Entry(root,textvariable=nameInput,bg="white",font=("Arial",28))
nameEntry.grid(row=2,column=2)
nameEntry.bind("<FocusOut>",nameValidation(nameInput.get()))

当我运行代码时,Entry 是红色的,表示该函数已被调用,即使键绑定未激活。

【问题讨论】:

  • 在最后一行你调用函数而不是作为回调引用它

标签: python function tkinter tkinter-entry


【解决方案1】:

你犯了一个非常常见的错误。您的函数在程序执行时执行,因为您在 .bind() 中使用括号调用了它。

解决此问题的一种方法是添加lambda

代码:

def nameValidation(name, event = None):
    if PresenceCheck(name) and LengthCheck(name,2) and DataTypeCheck(name,str):
        print("Valid Name")
    else:
        nameEntry.configure(bg="red")
nameEntry = tk.Entry(root,textvariable=nameInput,bg="white",font=("Arial",28))
nameEntry.grid(row=2,column=2)
nameEntry.bind("<FocusOut>", lambda: nameValidation(nameInput.get()))

希望这会有所帮助!


如 cmets 中所述,如果您需要匿名函数,请使用 lambda: event。如果您遇到错误,请使用lambda _:

【讨论】:

  • 这将抛出一个错误所有绑定将事件参数传递给回调函数的第一个参数。
  • @Saad 感谢您指出该错误。我将编辑我的答案。
  • 这里的回调函数是匿名函数lambda不是nameValidation,应该是lambda event: ...
  • 如果您不使用该参数,则只需 lambda _: ...
  • 另外,nameValidation(event = None, name) 这会报错。不能在普通参数之前给出默认参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
相关资源
最近更新 更多