Вызвана команда tkinter из меню и конфликт клавиш - PullRequest
0 голосов
/ 10 марта 2019

Я новичок, пытающийся выполнять действия в меню, которые также могут запускаться с помощью ярлыков, таких как наиболее распространенные «Файл> Новый» и «Ctrl + N». Вот код, с которым я пытаюсь работать:

import tkinter as tk

def do_nothing(self):
    print("Doing nothing.")

root = tk.Tk()
mainMenu = tk.Menu(root)
root.configure(menu=mainMenu)
fileMenu = tk.Menu(mainMenu, tearoff=0)
mainMenu.add_cascade(label="File", menu=fileMenu)
fileMenu.add_command(label="New", command=do_nothing, accelerator="Ctrl+N")
root.bind_all("<Control-n>", do_nothing)
tk.mainloop()

Вот моя проблема. При запуске кода выше, ярлык «Ctrl + N» работает нормально, но использование меню и нажатие «New» возвращает ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\username\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
TypeError: do_nothing() missing 1 required positional argument: 'self'

Я пытался изменить def do_nothing(self): на def do_nothing():, но ошибка теперь устранена. Использование меню и нажатие на «New» работает нормально, но сочетание клавиш «Ctrl + N» возвращает ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\username\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
TypeError: do_nothing() takes 0 positional arguments but 1 was given

Я хотел бы знать, что можно сделать, чтобы они оба работали как положено.

1 Ответ

0 голосов
/ 10 марта 2019
def do_nothing(*args):
    print("Doing nothing.")

Обратный вызов команды, обратный вызов связывания и обратный вызов трассировки имеют разные подписи.Чтобы удовлетворить их все, вам нужно определить множество значений по умолчанию или использовать *args.

...