2016-12-20 82 views
0

我想開發一個繼承自tkinter菜單類的類。這是我迄今爲止的代碼實現類MyMenu,之後創建一個測試實例mDummy並添加一個命令。__init __()缺少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菜單類希望我給變量'widgetName'作爲位置參數,但我無法找到文檔中的"widgetName"的含義。可能是錯誤在給定行中的其他地方,但代碼在調用__init__運算符時崩潰了?

+2

你應該總是使用*電流*類的'超()'調用; 'MyMenu',而不是'tk.Menu'。 –

+1

@DanielRoseman最好的方法是從Python 3中沒有參數地調用'super().__ init __()',這看起來就是這樣,因爲OP使用'print'作爲函數。 –

+0

這裏是tkinter的源代碼:http://mgltools.scripps.edu/api/DejaVu/Tkinter-pysrc.html也許它可以幫助你。菜單繼承Widget,繼承BaseWidget,它需要widgetName作爲初始參數 –

回答

0

super()期待你的widget的名字 - 這是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,我需要進行兩項更改才能使代碼正常工作。

相關問題