2016-12-20 5 views
0

Я хочу разработать класс, который наследуется от класса меню tkinter. Вот мой код до сих пор реализует класс MyMenu, затем создает тестовый экземпляр mDummy и добавляет команду.__init __() missing 1 обязательный позиционный аргумент: 'widgetName'

# import tkinter 
import tkinter as tk 
# define menu class 
class MyMenu(tk.Menu): 
    def __init__(self, arg_master=None, **options): 
    # call superclass constructors 
    super(tk.Menu,self).__init__(arg_master,**options) 

#define test command for menu 
def testcommand(): 
    print("This is a test") 

#start of the code  
main=tk.Tk() 
mDummy=MyMenu(main) 
main.config(menu=mDummy) 
mDummy.add_command(label="testlabel",command=testcommand) 

main.mainloop() 

выполнения результатов коды в ошибках типа:

TypeError: __init__() missing 1 required positional argument: 'widgetName'. 

Вот полная отслеживающий:

Traceback (most recent call last): File "C:\Program Files 
(x86)\Python34\MyProjects\tests\test_myUCVMenu.py", line 15, in <module> 
    mDummy=MyMenu(main) 
File "C:\Program Files (x86)\Python34\MyProjects\tests\test_myUCVMenu.py", line 7, in __init__ 
    super(tk.Menu,self).__init__(arg_master,**options) 
TypeError: __init__() missing 1 required positional argument: 'widgetName' 

Из сообщения, я думаю, что __init__ оператора Класс tkinter menu требует, чтобы я дал переменную 'widgetName' в качестве позиционного аргумента, но я не мог узнать значение "widgetName" в документе. Может быть, ошибка находится где-то в другом месте, чем в данной строке, но код падает при вызове оператора __init__?

+2

Вы должны всегда использовать * * текущий класс в 'супер()' вызов; 'MyMenu', а не' tk.Menu'. –

+1

@ DanielRoseman Лучшим способом является вызов 'super() .__ init __()' без аргументов, хотя из Python 3, который, по-видимому, имеет место, поскольку OP использует 'print' в качестве функции. –

+0

Вот исходный код tkinter: http://mgltools.scripps.edu/api/DejaVu/Tkinter-pysrc.html Возможно, это вам поможет. Меню наследует виджет, который наследует BaseWidget, которому требуется имя виджета как параметр init. –

ответ

0

super() ожидает вашего виджета имя - которое MyMenu, не tk.Menu

super(MyMenu, self).__init__(arg_master, **options) 
0

В самом деле, следующие работы:

import tkinter as tk 

class MyMenu(tk.Menu): 
    def __init__(self, arg_master=None, **options): 
     super().__init__(arg_master,**options) 

def testcommand(): 
    print("This is a test") 

main=tk.Tk() 
mDummy=MyMenu(main) 
main.config(menu=mDummy) 
mDummy.add_command(label="testlabel",command=testcommand) 

main.mainloop() 

Я сделал два исправления: я вновь отступом вызов super так находится внутри метода __init__; и я изменил метод super: Python 3 представил синтаксис super().__init__().

С Python 3.4 мне нужны оба изменения, чтобы заставить код работать.

 Смежные вопросы

  • Нет связанных вопросов^_^