TypeError:quit()需要1个位置参数但是给出了2个(键盘绑定)

时间:2016-03-04 05:19:20

标签: python-3.x tkinter

我有这个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

到底发生了什么事?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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