我正在尝试使用python 3和tkinter创建一个文本编辑器。文本编辑器工作得很好,除了当我尝试使用键盘快捷键时。每当我使用任何快捷方式时,都会收到一条错误消息,提示:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 1699, in __call__
return self.func(*args)
TypeError: newFile() takes 0 positional arguments but 1 was given
newFile()
可以替换为copySelected()
,selectAll()
或我尝试使用的任何命令。这仅在我尝试使用按键绑定时发生。从菜单栏中可以正常工作。奇怪的是,当我剪切,复制或粘贴我遇到错误时,它们实际上可以在应用程序中工作。这是密钥绑定代码:
textField.bind("<Command-n>", newFile)
textField.bind("<Command-N>", newFile)
textField.bind("<Command-o>", openFile)
textField.bind("<Command-O>", openFile)
textField.bind("<Command-s>", saveFile)
textField.bind("<Command-S>", saveFile)
textField.bind("<Command-n>", newFile)
textField.bind("<Command-n>", newFile)
textField.bind("<Command-z>", undo)
textField.bind("<Command-Z>", undo)
textField.bind("<Command-Shift-z>", redo)
textField.bind("<Command-Shift-Z>", redo)
textField.bind("<Command-x>", cutSelected)
textField.bind("<Command-X>", cutSelected)
textField.bind("<Command-c>", copySelected)
textField.bind("<Command-C>", copySelected)
textField.bind("<Command-v>", paste)
textField.bind("<Command-V>", paste)
textField.bind("<Command-a>", selectAll)
textField.bind("<Command-A>", selectAll)
我目前正在Mac OS上测试代码,但是我已经将代码指定为特定于操作系统,以便它也可以在Windows和Linux上运行。 Windows和Linux代码完全相同,只是Command被Control取代。该错误在所有三个平台上都发生。
任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
TypeError:newFile()接受0个位置参数,但给出了1个
我假设您忘记添加事件参数。
def saveFile(self, event):
# Code here
现在您可以致电
textField.bind("<Command-S>", saveFile)
如果这不起作用,请向我们提供您的saveFile函数/方法。
答案 1 :(得分:0)
将键绑定到函数时,tkinter会自动将对象传递给回调。该对象表示导致回调被调用的事件。它具有诸如接收事件的小部件,鼠标的x和y坐标以及事件特有的其他详细信息(鼠标按钮,键盘字符等)之类的信息。
将功能绑定到事件时,您的功能必须能够接受此参数。例如:
await page.waitForSelector(selector);
请注意,这与您通过小部件的def newFile(event):
...
属性调用该函数不同。在这种情况下,不会传递任何command
对象。如果您希望既可以通过绑定又可以通过event
属性来调用函数,则可以将参数设为可选(并确保您的函数实际上并未尝试使用它,因为它可能不会出现):
command
答案 2 :(得分:-1)
我猜您正在使用类,而键盘快捷键的回调是:
def saveFile():
# Code here
但是您的方法应该是:
def saveFile(self):
# Code here
,因为您始终必须包含自我参考。
如果这不起作用,您可能必须包含有关代码的更多详细信息,以便我们查明您的问题。