Python Keybind使函数在启动时自动运行

Python Keybind使函数在启动时自动运行,python,function,tkinter,tkinter-entry,Python,Function,Tkinter,Tkinter Entry,我正在尝试为我的条目创建一个键绑定,该键绑定将用户输入到条目中,然后调用一个函数 我的代码: def nameValidation(name): if PresenceCheck(name) and LengthCheck(name,2) and DataTypeCheck(name,str): print("Valid Name") else: nameEntry.configure(bg="red") n

我正在尝试为我的
条目
创建一个键绑定,该键绑定将用户输入到
条目
中,然后调用一个函数

我的代码:

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()))
def名称验证(名称):
如果存在检查(名称)、长度检查(名称,2)和数据类型检查(名称,str):
打印(“有效名称”)
其他:
nameEntry.configure(bg=“红色”)
nameEntry=tk.Entry(根,textvariable=nameInput,bg=“白色”,font=(“Arial”,28))
nameEntry.grid(行=2,列=2)
nameEntry.bind(“,nameValidation(nameInput.get()))

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

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

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

代码:

def名称验证(名称,事件=None):
如果存在检查(名称)、长度检查(名称,2)和数据类型检查(名称,str):
打印(“有效名称”)
其他:
nameEntry.configure(bg=“红色”)
nameEntry=tk.Entry(根,textvariable=nameInput,bg=“白色”,font=(“Arial”,28))
nameEntry.grid(行=2,列=2)
nameEntry.bind(“,lambda:nameValidation(nameInput.get()))
希望这有帮助



如注释中所述,如果需要匿名函数,请使用
lambda:event
。如果出现错误,请在调用函数的最后一行中使用
lambda:

,而不是将其作为回调引用。这将引发错误。所有绑定都会将事件参数传递给回调函数的第一个参数。@Saad感谢您指出该错误。我将编辑我的答案。这里的回调函数是匿名函数lambda而不是
namevalization
,它应该是
lambda事件:
或只是
lambda:…
如果您没有使用参数,
namevalization(event=None,name)
这将给出一个错误。不能在普通参数之前给出默认参数