我有这个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
到底发生了什么事?
答案 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函数出错的原因。