Reputation: 464
I am using the following snippet from a tutorial of Tkinter to create a Gui with a menu Bar. I copied exactly how it was in the tutorial:
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)
However I receive the following error:
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'
I read this post:
https://stackoverflow.com/questions/52015321/is-there-any-differences-between-python2-and-python3-about-adding-menu-bar-to-fr
And they say this attribute 'tk_menuBar' has been deprecated from both Python 2 and Python 3. Does anyone have a solution how it should be used in my version of python? (3.6).
Upvotes: 0
Views: 1658
Reputation: 195
You can still do the following
if name == "main":
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()
Upvotes: 2
Reputation:
mBar = Frame(root, relief=RAISED, borderwidth=2)
after loading the root Tk, you declared mBar as a variable for frame then you try to access it using Object oriented method which i think it won't work
Upvotes: 1