【问题标题】:Tkinter bind not working when passed root.destroy directly直接通过 root.destroy 时,Tkinter 绑定不起作用
【发布时间】:2016-12-02 14:02:29
【问题描述】:

我对 python 和 tkinter 还很陌生。我正在使用 python 2.7 和 tkinter 8.5。

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

当我将 root.destoy 作为参数传递给 bind() 时,应用什么也不做:

root = Tk()
...
root.bind('<Escape>', root.destroy)

但如果我定义一个调用 root.destroy() 的函数并将其作为参数传递给 bind,一切都会按预期工作:

def exit_app():
    root.destroy()
root.bind('<Escape>', exit_app)

如果我像这样传递一个 lambda,它也可以工作:

root.bind('<Escape>', lambda f: root.destroy())

谁能解释这里发生了什么?

谢谢

【问题讨论】:

  • 我很难相信它可以与exit_app 一起使用。这应该会给出与直接绑定到 root.destroy 时完全相同的错误。
  • @furas 对不起,错字只存在于这篇文章中(我没有复制和粘贴,这只是一个简化的例子)。马上编辑帖子。谢谢
  • @BryanOakley 为什么你觉得难以置信?它在我的机器上运行
  • 在控制台中运行时是否收到错误消息?你应该 - bind 用一个参数执行函数,你定义 exit_app() 不带参数
  • 如果它工作正常,请创建一个Minimal, Complete and Verifiable Example。发布“简化示例”还不够好,因为您的简化示例不能很好地代表您的实际代码。

标签: python python-2.7 tkinter


【解决方案1】:

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

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

您在问题中声称它适用于这个确切的函数定义:

def exit_app():
    root.destroy()

出于与上述相同的原因,我觉得这难以置信。

【讨论】:

  • 对不起,你是对的。在我的真实代码中,我调用了一个带有签名“def btn_click(*args):”的按钮处理程序,并在其中调用了 root.destroy()。对不起,我不认为这很重要。感谢您的快速回复。
  • @AwerMuller:如果您花时间创建minimal, complete and verifiable example,您可能会自己了解到该参数是一个关键组件。这就是我们要求 MCVE 的原因——通常,创建它的努力会暴露问题,而您不必在这里提出问题。至少,它会让你写出更好的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 2020-12-24
相关资源
最近更新 更多