键盘快捷键给我在Tkinter中的错误

时间:2018-10-28 14:23:19

标签: linux python-3.x windows macos tkinter

我正在尝试使用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取代。该错误在所有三个平台上都发生。

任何帮助将不胜感激。谢谢!

3 个答案:

答案 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

,因为您始终必须包含自我参考。

如果这不起作用,您可能必须包含有关代码的更多详细信息,以便我们查明您的问题。