Python 直接传递root.destroy时,Tkinter绑定不工作

Python 直接传递root.destroy时,Tkinter绑定不工作,python,python-2.7,tkinter,Python,Python 2.7,Tkinter,我对python和tkinter相当陌生。我正在使用python 2.7和tkinter 8.5 当按下escape键时,我试图退出我的应用程序,我遇到了一些奇怪的行为: 当我将root.destoy作为参数传递给bind()时,应用程序不执行任何操作: root = Tk() ... root.bind('<Escape>', root.destroy) root=Tk() ... root.bind(“”,root.destroy) 但如果我定义了一个调用root.destr

我对python和tkinter相当陌生。我正在使用python 2.7和tkinter 8.5

当按下escape键时,我试图退出我的应用程序,我遇到了一些奇怪的行为:

当我将root.destoy作为参数传递给bind()时,应用程序不执行任何操作:

root = Tk()
...
root.bind('<Escape>', root.destroy)
root=Tk()
...
root.bind(“”,root.destroy)
但如果我定义了一个调用root.destroy()的函数,并将其作为参数传递给bind,那么一切都会按预期进行:

def exit_app():
    root.destroy()
root.bind('<Escape>', exit_app)
def exit_app():
root.destroy()
root.bind(“”,退出应用程序)
如果我通过这样的lambda,它也会起作用:

root.bind('<Escape>', lambda f: root.destroy())
root.bind(“”,lambda f:root.destroy())
有人能解释一下这里发生了什么吗


谢谢

当您将命令绑定到事件时,该命令将被传递一个参数,该参数是表示事件的对象
root.destroy
不接受任何参数,因此它将抛出错误而不是运行

这就是lambda工作的原因:lambda接受一个参数(奇怪的是,命名为
f

在您的问题中,您声称它适用于此精确的函数定义:

def exit_app():
    root.destroy()

我发现这难以置信,原因与上述相同。

我发现很难相信它与
exit\u app
一起工作。这应该会产生与直接绑定到root.destroy时完全相同的错误。@furas抱歉,该错误仅存在于本文中(我没有复制和粘贴,这只是一个简化的示例)。现在就编辑这篇文章。Thanks@BryanOakley为什么你觉得很难相信?它在我的机器上工作。当您在控制台中运行它时,是否收到错误消息?您应该-
bind
使用一个参数执行函数,并定义
exit_app()
而不使用参数。如果该函数正常工作,请创建一个参数。发布“简化示例”是不够的,因为您的简化示例不能很好地表示您的实际代码。对不起,您是对的。在我的实际代码中,我调用了一个带有签名“def btn_click(*args):”的按钮处理程序,并在其中调用root.destroy()。抱歉弄得一团糟,我认为这不重要。谢谢您的快速回复。@AwerMuller:如果您花时间创建了一个新的参数,您可能会自己知道该参数是一个关键的组成部分。这就是为什么我们需要一个MCVE——通常,创建MCVE的努力会暴露问题,而不必在这里提出问题。至少,它会让你写一个更好的问题。