当直接传递root.destroy时,Tkinter绑定不起作用
我对Python和tkinter相当陌生。我正在使用python 2.7和tkinter 8.5。当直接传递root.destroy时,Tkinter绑定不起作用
我试着按下Escape键,退出我的应用程序,我遇到了一些奇怪的行为:
当我通过root.destoy作为参数bind()时,应用程序不执行任何操作:
root = Tk()
...
root.bind('<Escape>', root.destroy)
但是如果我定义调用root.destroy(功能),并通过作为绑定参数,一切正常:
def exit_app():
root.destroy()
root.bind('<Escape>', exit_app)
它也可以,如果我通过像拉姆达这个:
root.bind('<Escape>', lambda f: root.destroy())
任何人都可以解释这里发生了什么?
由于
在绑定一个命令到一个事件时,该命令被传递的参数,它是是表示事件的对象。 root.destroy
不接受任何参数,因此它抛出错误而不是运行。
这就是为什么你的lambda工作原理:你的lambda接受一个参数(奇怪的是,名字为f
)。
你声称你的问题,它的工作原理与此完全相同的功能定义:
def exit_app():
root.destroy()
我觉得无法相信,对于上述同样的原因。
对不起,你是对的。在我的真实代码中,我调用了一个名为“def btn_click(* args):”的按钮处理程序,并在其中调用root.destroy()。对不起,我不认为这很重要。感谢您的快速回复。 –
@AwerMuller:如果您花时间创建了一个[最小,完整且可验证的示例](http://stackoverflow.com/help/mcve),您可能会自己了解到该论点是一个关键组成部分。这就是为什么我们要求一个MCVE--通常,创建它的努力会暴露问题,而不必在这里提出问题。至少,它会让你写一个更好的问题。 –
我觉得很难相信它可以和'exit_app'一起使用。这应该给出与直接绑定到root.destroy时完全相同的错误。 –
@furas对不起,错字只存在于这篇文章(我没有复制和粘贴,它只是一个简单的例子)。现在编辑帖子。谢谢 –
@BryanOakley你为什么觉得很难相信?它在我的机器上工作 –