【问题标题】:Keyboard shortcuts giving me errors in tkinter键盘快捷键给我在 tkinter 中的错误
【发布时间】:2019-04-01 14:51:05
【问题描述】:

我正在尝试使用 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 之外完全相同。错误发生在所有三个平台上。

非常感谢任何帮助。谢谢!

【问题讨论】:

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


    【解决方案1】:

    当您将键绑定到函数时,tkinter 会自动将对象传递给回调。此对象表示导致回调被调用的事件。它包含诸如接收事件的小部件、鼠标的 x 和 y 坐标以及事件特有的其他详细信息(鼠标按钮、键盘字符等)等信息。

    当您将函数绑定到事件时,您的函数必须能够接受此参数。例如:

    def newFile(event):
        ...
    

    请注意,这与通过小部件的command 属性调用函数不同。在这种情况下,不会传递 event 对象。如果您希望能够通过绑定和command 属性调用该函数,那么您可以将参数设为可选(并确保您的函数实际上并未尝试使用它,因为它可能不存在):

    def newFile(event=None):
        ...
    

    【讨论】:

    • 非常感谢!它现在完美运行!我使用 event=None 因为我需要它作为命令和事件。
    【解决方案2】:

    TypeError: newFile() 接受 0 个位置参数,但给出了 1 个

    我假设您忘记添加事件参数。

    def saveFile(self, event):
        # Code here
    

    现在你可以打电话了

    textField.bind("<Command-S>", saveFile)
    

    如果这不起作用,请向我们提供您的 saveFile 函数/方法。

    【讨论】:

    • 我不确定这是否是问题所在。当我使用菜单栏中的下拉菜单并且我在那里以相同的方式调用该函数时,它工作得很好。有机会我会试试这个并回复你
    【解决方案3】:

    我猜你正在使用类,键盘快捷键的回调是:

    def saveFile():
        # Code here
    

    但你的方法应该是:

    def saveFile(self):
        # Code here
    

    因为您总是必须包含自我参考。

    如果这不起作用,您可能需要提供有关您的代码的更多详细信息,以便我们查明您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2016-06-22
      • 1970-01-01
      相关资源
      最近更新 更多