【问题标题】:TypeError: quit() takes 1 positional argument but 2 were given (keyboard bind)TypeError:quit() 接受 1 个位置参数,但给出了 2 个(键盘绑定)
【发布时间】:2016-03-04 05:19:20
【问题描述】:

我有这个 python 代码:

def initUI(self):
        self.parent.title("Simple menu")
        menubar = Menu(self.parent)
        self.parent.config(menu=menubar)

        #file menu
        fileMenu = Menu(menubar)
        menubar.add_cascade(label="File", menu=fileMenu)
        fileMenu.add_command(label="Exit", command=self.quit, accelerator="Ctrl+Q")
        self.bind_all("<Control-q>", self.quit)

    def quit(self):
        sys.exit(0)

当我从菜单中选择退出时,它工作正常。但是,当我按ctrl+q 时,我收到此错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/tkinter/__init__.py", line 1538, in __call__
    return self.func(*args)
TypeError: quit() takes 1 positional argument but 2 were given

这到底是怎么回事?

【问题讨论】:

  • 通过查看你的代码我可以说一件事,函数 quit(self) 的缩进不正确。我确定如果你尝试运行这个模块,它会抛出语法错误。
  • 抱歉,在课堂上。

标签: python-3.x tkinter


【解决方案1】:

当 tk 调用绑定事件函数时,它会传递一个事件,其中包含here 描述的所有信息。作为简化,当 tk 调用 Button click 命令函数时,它不会传递事件,因为它不是必需的。该事件被称为 Button-1 单击,并且光标在按钮内的位置几乎从不相关。 (如果想处理按钮内的其他鼠标事件,或者关心鼠标位置,则应显式绑定事件处理程序。)

在您的情况下,由于您不关心事件对象,因此添加一个默认为无的可选事件参数。当使用 ^Q 而不是按钮调用函数时,这将“吞噬”事件。

    def quit(self, event=None):
        sys.exit(0)

【讨论】:

    【解决方案2】:

    这是另一种解决方案,使用 lambdas:

    self.bind('<Control-q>', lambda e: self.quit())
    

    注意: Terry Jan Reedy 提到了事件绑定将如何传递额外的参数(事件详细信息),这就是退出函数出错的原因。

    【讨论】:

      猜你喜欢
      • 2017-11-01
      • 2016-10-13
      • 2019-04-20
      • 2018-11-15
      • 2014-07-19
      • 2016-08-09
      • 2020-01-30
      • 2019-08-02
      • 1970-01-01
      相关资源
      最近更新 更多