Сочетания клавиш дают мне ошибки в tkinter - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь создать текстовый редактор с 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 голосов
/ 28 октября 2018

TypeError: newFile () принимает 0 позиционных аргументов, но 1 был дан

Полагаю, вы забыли добавить аргумент события.

def saveFile(self, event):
    # Code here

теперь вы можете вызвать

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

Если это не работает, предоставьте нам свою функцию / метод saveFile.

0 голосов
/ 29 октября 2018

Когда вы связываете ключ с функцией, tkinter автоматически передает объект в обратный вызов.Этот объект представляет событие, которое вызвало обратный вызов.Он содержит такую ​​информацию, как виджет, который получил событие, координаты x и y мыши и другие сведения, уникальные для этого события (кнопка мыши, символ клавиатуры и т. Д.).

Когда вы привязываете функцию ксобытие, ваша функция должна быть в состоянии принять этот параметр.Например:

def newFile(event):
    ...

Обратите внимание, что это отличается от того, что вы вызываете функцию через атрибут command виджета.В этом случае объект event не передается.Если вы хотите иметь возможность вызывать функцию как через привязку, так и через атрибут command, то вы можете сделать параметр необязательным (и убедиться, что ваша функция фактически не пытается использовать его, поскольку он может отсутствовать).):

def newFile(event=None):
    ...
0 голосов
/ 28 октября 2018

Я предполагаю, что вы используете классы и обратные вызовы для сочетаний клавиш:

def saveFile():
    # Code here

, но ваш метод должен быть:

def saveFile(self):
    # Code here

, так как вы всегда должны включатьСамостоятельная ссылка.

Если это не сработает, возможно, вам придется указать более подробную информацию о вашем коде, чтобы мы могли точно определить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...