无法创建菜单AttributeError:“框架”对象没有属性“ tk_menuBar”

时间:2019-07-27 20:42:36

标签: python tkinter menu

我正在使用Tkinter教程中的以下代码片段创建带有菜单栏的Gui。我完全复制了本教程中的内容:

from tkinter import *
from tkinter import Menu
from tkinter import Menubutton
def new_file():
    pass

def open_file():
    pass 

def stub_action():
    pass


def makeCascadeMenu():
    CasBtn = Menubutton(mBar, text='Cascading Menus', underline=0)
    CasBtn.pack(side=LEFT, padx="2m")
    CasBtn.menu = Menu(CasBtn) 

    CasBtn.menu.choices = Menu(CasBtn.menu) 
    CasBtn.menu.choices.wierdones = Menu(CasBtn.menu.choices) 

    CasBtn.menu.choices.wierdones.add_command(label='Stockbroker') 
    CasBtn.menu.choices.wierdones.add_command(label='Quantity Surveyor') 
    CasBtn.menu.choices.wierdones.add_command(label='Church Warden') 
    CasBtn.menu.choices.wierdones.add_command(label='BRM')
    CasBtn.menu.choices.wierdones.add_command(label='Wooden Leg') 
    CasBtn.menu.choices.wierdones.add_command(label='Hire Purchase') 
    CasBtn.menu.choices.wierdones.add_command(label='Dead Crab') 
    CasBtn.menu.choices.wierdones.add_command(label='Tree Surgeon') 
    CasBtn.menu.choices.wierdones.add_command(label='Filling Cabinet') 
    CasBtn.menu.choices.wierdones.add_command(label='Goldfish') 
    CasBtn.menu.choices.wierdones.add_command(label='Is it a ...') 
    CasBtn.menu.choices.add_cascade(label='Is it a ...', 
    menu=CasBtn.menu.choices.wierdones) 
    CasBtn.menu.add_cascade(label='Scipts', menu=CasBtn.menu.choices)
    CasBtn['menu'] = CasBtn.menu 
    return CasBtn



def makeCheckButtonMenu():
    ChkBtn = Menubutton(mBar, text = 'Checkbutton Menus', underline=0) 
    ChkBtn.pack(side=LEFT, padx='2m') 
    ChkBtn.menu = Menu(ChkBtn) 

    ChkBtn.menu.add_checkbutton(label='Doug')
    ChkBtn.menu.add_checkbutton(label='Dinsdale')
    ChkBtn.menu.add_checkbutton(label='Stig O\'Tracy')
    ChkBtn.menu.add_checkbutton(label='Vince')
    ChkBtn.menu.add_checkbutton(label='Gloria Pules')

    ChkBtn.menu.invoke(ChkBtn.menu.index('Dinsdale')) 
    ChkBtn['menu'] = ChkBtn.menu 
    return ChkBtn

def makeRadiobuttonMenu():
    RadBtn = Menubutton(mBar, text='Radiobutton Menus', underline=0)
    RadBtn.pack(side=LEFT, padx='2m')
    RadBtn.menu = Menu(RadBtn)
    RadBtn.menu.add_radiobutton(label='metonymy')
    RadBtn.menu.add_radiobutton(label='zeugmatists')
    RadBtn.menu.add_radiobutton(label='synechdotists')
    RadBtn.menu.add_radiobutton(label='axiomists')
    RadBtn.menu.add_radiobutton(label='anagogists')
    RadBtn.menu.add_radiobutton(label='catachresis')
    RadBtn.menu.add_radiobutton(label='periphrastic')
    RadBtn.menu.add_radiobutton(label='litotes')
    RadBtn.menu.add_radiobutton(label='circumlocutors')
    RadBtn['menu'] = RadBtn.menu
    return RadBtn

def makeDisabledMenu():
    Dummy_button = Menubutton(mBar, text='Disabled Menu', underline=0)
    Dummy_button.pack(side=LEFT, padx='2m')
    Dummy_button["state"] = DISABLED
    return Dummy_button

def makeCommandMenu():
    CmdBtn = Menubutton(mBar, text='Button Commands', underline=0)
    CmdBtn.pack(side=LEFT, padx="2m")
    CmdBtn.menu = Menu(CmdBtn)
    CmdBtn.menu.add_command(label="Undo")
    CmdBtn.menu.entryconfig(0, state=DISABLED)
    CmdBtn.menu.add_command(label='New...', underline=0, command=new_file)
    CmdBtn.menu.add_command(label='Open...', underline=0, command=open_file)
    CmdBtn.menu.add_command(label='Wild Font', underline=0,
    font=('Tempus Sans ITC', 14), command=stub_action)
    #CmdBtn.menu.add_command(bitmap="@bitmaps/RotateLeft")
    CmdBtn.menu.add('separator')
    CmdBtn.menu.add_command(label='Quit', underline=0,
    background='white', activebackground='green',
    command=CmdBtn.quit)
    CmdBtn['menu'] = CmdBtn.menu
    return CmdBtn

root = tkinter.Tk()

mBar = Frame(root, relief=RAISED, borderwidth=2)
mBar.pack(fill=X)
CmdBtn = makeCommandMenu()
CasBtn = makeCascadeMenu()
ChkBtn = makeCheckButtonMenu()
RadBtn = makeRadiobuttonMenu()
NoMenu = makeDisabledMenu()
mBar.tk_menuBar(CmdBtn, CasBtn, ChkBtn, RadBtn, NoMenu)

但是我收到以下错误:

Traceback (most recent call last):
  File "Menu.py", line 106, in <module>
    mBar.tk_menuBar(CmdBtn, CasBtn, ChkBtn, RadBtn, NoMenu)
AttributeError: 'Frame' object has no attribute 'tk_menuBar'

我读了这篇文章: https://stackoverflow.com/questions/52015321/is-there-any-differences-between-python2-and-python3-about-adding-menu-bar-to-fr

他们说此属性“ tk_menuBar”已在Python 2和Python 3中弃用。有人能在我的python版本中使用它吗? (3.6)。

3 个答案:

答案 0 :(得分:1)

https://stackoverflow.com/a/52017490/11837698

布莱恩在论文中对此进行了解释。 您应该根据他的说明重新配置代码

答案 1 :(得分:1)

mBar =框架(根,浮雕=凸起,边框宽度= 2)

在加载根Tk之后,您将mBar声明为frame的变量,然后尝试使用面向对象的方法访问它,我认为这是行不通的

答案 2 :(得分:1)

您仍然可以执行以下操作

如果名称 ==“ 主要”:

root = Tk()
mBar = Frame(root, relief=RAISED, borderwidth=2)
mBar.pack(fill=X)
cmdBtn = makeCommandMenu()
casBtn = makeCascadeMenu()
chkBtn = makeCheckbuttonMenu()
radBtn = makeRadiobuttonMenu()
noMenu = makeDisabledMenu()
menuBar = Menu()
menuBar.add_cascade(label="command", menu=cmdBtn)
menuBar.add_cascade(label="cascade", menu=casBtn)
menuBar.add_cascade(label="check", menu=chkBtn)
menuBar.add_cascade(label="radio", menu=radBtn)
menuBar.add_cascade(label="disable",menu=noMenu)
root.mainloop()