2016-12-02 77 views
-1

我对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()) 

任何人都可以解释这里发生了什么?

由于

+0

我觉得很难相信它可以和'exit_app'一起使用。这应该给出与直接绑定到root.destroy时完全相同的错误。 –

+0

@furas对不起,错字只存在于这篇文章(我没有复制和粘贴,它只是一个简单的例子)。现在编辑帖子。谢谢 –

+0

@BryanOakley你为什么觉得很难相信?它在我的机器上工作 –

回答

1

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

这就是为什么你的lambda工作原理:你的lambda接受一个参数(奇怪的是,名字为f)。

你声称你的问题,它的工作原理与此完全相同的功能定义:

def exit_app(): 
    root.destroy() 

我觉得无法相信,对于上述同样的原因。

+0

对不起,你是对的。在我的真实代码中,我调用了一个名为“def btn_click(* args):”的按钮处理程序,并在其中调用root.destroy()。对不起,我不认为这很重要。感谢您的快速回复。 –

+0

@AwerMuller:如果您花时间创建了一个[最小,完整且可验证的示例](http://stackoverflow.com/help/mcve),您可能会自己了解到该论点是一个关键组成部分。这就是为什么我们要求一个MCVE--通常,创建它的努力会暴露问题,而不必在这里提出问题。至少,它会让你写一个更好的问题。 –