Python GUI Tk : Menu

Menu/tool bars packed before middle

from Tkinter import *           
from tkMessageBox import *      

class NewMenuDemo(Frame):                 
    def __init__(self, parent=None):      
        Frame.__init__(self, parent)      
        self.pack(expand=YES, fill=BOTH)
        self.createWidgets()              
        self.master.title("Toolbars and Menus")
        self.master.iconname("tkpython")       

    def createWidgets(self):
        self.makeMenuBar()
        self.makeToolBar()
        L = Label(self, text='Menu and Toolbar Demo')
        L.config(relief=SUNKEN, width=40, height=10, bg='white')
        L.pack(expand=YES, fill=BOTH)

    def makeToolBar(self):
        toolbar = Frame(self, cursor='hand2', relief=SUNKEN, bd=2)
        toolbar.pack(side=BOTTOM, fill=X)
        Button(toolbar, text='Quit',  command=self.quit    ).pack(side=RIGHT)
        Button(toolbar, text='Hello', command=self.greeting).pack(side=LEFT)

    def makeMenuBar(self):
        self.menubar = Menu(self.master)
        self.master.config(menu=self.menubar)  
        self.fileMenu()
        self.editMenu()
#        self.imageMenu()

    def fileMenu(self):
        pulldown = Menu(self.menubar)
        pulldown.add_command(label='Open...', command=self.notdone)
        pulldown.add_command(label='Quit',    command=self.quit)
        self.menubar.add_cascade(label='File', underline=0, menu=pulldown)

    def editMenu(self):
        pulldown = Menu(self.menubar)
        pulldown.add_command(label='Paste',   command=self.notdone)
        pulldown.add_command(label='Spam',    command=self.greeting)
        pulldown.add_separator()
        pulldown.add_command(label='Delete',  command=self.greeting)
        pulldown.entryconfig(4, state=DISABLED)
        self.menubar.add_cascade(label='Edit', underline=0, menu=pulldown)

#    def imageMenu(self):
#        photoFiles = ('guido.gif', 'java2s.gif', 'java2s.gif') 
#        pulldown = Menu(self.menubar)
#        self.photoObjs = []
#        for file in photoFiles:
#            img = PhotoImage(file='../gifs/' + file)
#            pulldown.add_command(image=img, command=self.notdone)
#            self.photoObjs.append(img)   # keep a reference
#        self.menubar.add_cascade(label='Image', underline=0, menu=pulldown)

    def greeting(self): 
        showinfo('greeting', 'Greetings')
    def notdone(self):  
        showerror('Not implemented', 'Not yet available') 
    def quit(self):
        if askyesno('Verify quit', 'Are you sure you want to quit?'):
            Frame.quit(self)

if __name__ == '__main__':  NewMenuDemo().mainloop()  # if I'm run as a script
A big menu bar
from Tkinter import *

def new_file():
    print "Open new file"

def open_file():
    print "Open existing file"

def stub_action():
    print "Menu select"

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

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='A')
    CasBtn.menu.choices.wierdones.add_command(label='B')
    CasBtn.menu.choices.wierdones.add_command(label='C')
    CasBtn.menu.choices.wierdones.add_command(label='D')    

    CasBtn.menu.choices.add_command(label='A')
    CasBtn.menu.choices.add_command(label='B')
    CasBtn.menu.choices.add_command(label='C')
    CasBtn.menu.choices.add_command(label='D')
    CasBtn.menu.choices.add_command(label='E')
    CasBtn.menu.choices.add_command(label='F')
    CasBtn.menu.choices.add_cascade(label='G', 
  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='A')
    ChkBtn.menu.add_checkbutton(label='B')
    ChkBtn.menu.add_checkbutton(label="C")
    ChkBtn.menu.add_checkbutton(label='D')
    ChkBtn.menu.add_checkbutton(label='E')    
    ChkBtn.menu.invoke(ChkBtn.menu.index('C'))

    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='A')
    RadBtn.menu.add_radiobutton(label='B')
    RadBtn.menu.add_radiobutton(label='C')
    RadBtn.menu.add_radiobutton(label='D')
    RadBtn.menu.add_radiobutton(label='E')
    RadBtn.menu.add_radiobutton(label='F')
    RadBtn.menu.add_radiobutton(label='G')
    RadBtn.menu.add_radiobutton(label='H')
    RadBtn.menu.add_radiobutton(label='I')

    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

root = 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)

root.title('Menus')
root.mainloop()

Set up menu and add action to it

from Tkinter import *

class AllTkinterWidgets:
    def __init__(self, master):
        frame = Frame(master, width=500, height=400, bd=1)
        frame.pack()

  self.mbar = Frame(frame, relief = 'raised', bd=2)
  self.mbar.pack(fill = X)

  self.filebutton = Menubutton(self.mbar, text = 'File')
  self.filebutton.pack(side = LEFT)

  self.filemenu = Menu(self.filebutton, tearoff=0)
  self.filebutton['menu'] = self.filemenu

  self.filemenu.add('command', label = 'Exit', command = self.quit)

  self.objectbutton = Menubutton(self.mbar, text = 'Object', )
  self.objectbutton.pack(side = LEFT)

  self.objectmenu = Menu(self.objectbutton, tearoff=0)
  self.objectbutton['menu'] = self.objectmenu

  self.objectmenu.add('command', label = 'object', command = self.stub)

    self.editbutton = Menubutton(self.mbar, text = 'Edit', )
  self.editbutton.pack(side = LEFT)

  self.editmenu = Menu(self.editbutton, tearoff=0)
  self.editbutton['menu'] = self.editmenu

  self.editmenu.add('command', label = 'edit', command = self.stub)

  self.viewbutton = Menubutton(self.mbar, text = 'View', )
  self.viewbutton.pack(side = LEFT)

  self.viewmenu = Menu(self.viewbutton, tearoff=0)
  self.viewbutton['menu'] = self.viewmenu

  self.viewmenu.add('command', label = 'view', command = self.stub)

  self.toolsbutton = Menubutton(self.mbar, text = 'Tools', )
  self.toolsbutton.pack(side = LEFT)

  self.toolsmenu = Menu(self.toolsbutton, tearoff=0)
  self.toolsbutton['menu'] = self.toolsmenu

  self.toolsmenu.add('command', label = 'tools', command = self.stub)

  self.helpbutton = Menubutton(self.mbar, text = 'Help', )
  self.helpbutton.pack(side = RIGHT)

  self.helpmenu = Menu(self.helpbutton, tearoff=0)
  self.helpbutton['menu'] = self.helpmenu

  self.helpmenu.add('command', label = 'help', command = self.stub)

    def quit(self):
        root.destroy()

    def stub(self):
        pass
    
root = Tk()
all = AllTkinterWidgets(root)
root.title('Tkinter Widgets')
root.mainloop()
Disable a menu item
from Tkinter import *

class TestMenu:
    def __init__(self, master):
  self.master = master
  self.menubar = Menu(self.master)

        self.cmdmenu = Menu(self.menubar)
        self.cmdmenu.add_command(label="Undo")
        self.cmdmenu.entryconfig(1, state=DISABLED)

        self.unused = Menu(self.menubar)
        
        self.menubar.add_cascade(label="Button Command", menu=self.cmdmenu)

  self.top = Toplevel(menu=self.menubar, width=500, relief=RAISED,
                            borderwidth=2)

def main():
    root = Tk()
    root.withdraw()
    app = TestMenu(root)
    root.mainloop()

if __name__ == '__main__':
    main()

Set menu item font

from Tkinter import *

class TestMenu:
    def __init__(self, master):
  self.master = master
  self.menubar = Menu(self.master)

        self.cmdmenu = Menu(self.menubar)
        self.cmdmenu.add_command(label='Wild Font', underline=0,
                         font=('Tempus Sans ITC', 14))
        self.cmdmenu.add('separator')
        self.cmdmenu.add_command(label='Quit', underline=0, 
                                 background='white', activebackground='green', 
                                 command=self.master.quit)

        self.unused = Menu(self.menubar)
        
        self.menubar.add_cascade(label="Button Command", menu=self.cmdmenu)

  self.top = Toplevel(menu=self.menubar, width=500, relief=RAISED,
                            borderwidth=2)

def main():
    root = Tk()
    root.withdraw()
    app = TestMenu(root)
    root.mainloop()

if __name__ == '__main__':
    main()
Menu item mouse on (active) foreground color
from Tkinter import *

class TestMenu:
    def __init__(self, master):
  self.master = master
  self.menubar = Menu(self.master)

        self.cmdmenu = Menu(self.menubar)
        self.cmdmenu.add_command(label='Quit', underline=0, 
                                 background='white', activebackground='green', 
                                 command=self.master.quit)

        self.unused = Menu(self.menubar)
        
        self.menubar.add_cascade(label="Button Command", menu=self.cmdmenu)

  self.top = Toplevel(menu=self.menubar, width=500, relief=RAISED,
                            borderwidth=2)

def main():
    root = Tk()
    root.withdraw()
    app = TestMenu(root)
    root.mainloop()

if __name__ == '__main__':
    main()

Underline for menu item text

from Tkinter import *

class TestMenu:
    def __init__(self, master):
  self.master = master
  self.menubar = Menu(self.master)

        self.cmdmenu = Menu(self.menubar)
        self.cmdmenu.add_command(label='New...', underline=0)
        self.cmdmenu.add_command(label='Open...', underline=0)
        self.cmdmenu.add_command(label='Wild Font', underline=0,
                         font=('Tempus Sans ITC', 14))
#        self.cmdmenu.add_command(bitmap="someBitMap")
        self.cmdmenu.add('separator')

        self.unused = Menu(self.menubar)
        
        self.menubar.add_cascade(label="Button Command", menu=self.cmdmenu)

  self.top = Toplevel(menu=self.menubar, width=500, relief=RAISED,
                            borderwidth=2)

def main():
    root = Tk()
    root.withdraw()
    app = TestMenu(root)
    root.mainloop()

if __name__ == '__main__':
    main()
Menu separator
from Tkinter import *

class TestMenu:
    def __init__(self, master):
  self.master = master
  self.menubar = Menu(self.master)

        self.cmdmenu = Menu(self.menubar)
        self.cmdmenu.add_command(label='New...', underline=0)
        self.cmdmenu.add_command(label='Open...', underline=0)
        self.cmdmenu.add_command(label='Wild Font', underline=0,
                         font=('Tempus Sans ITC', 14))
#        self.cmdmenu.add_command(bitmap="someBitMap")
        self.cmdmenu.add('separator')

        self.unused = Menu(self.menubar)
        
        self.menubar.add_cascade(label="Button Command", menu=self.cmdmenu)

  self.top = Toplevel(menu=self.menubar, width=500, relief=RAISED,
                            borderwidth=2)

def main():
    root = Tk()
    root.withdraw()
    app = TestMenu(root)
    root.mainloop()

if __name__ == '__main__':
    main()

Cascade Menu

from Tkinter import *

class TestMenu:
    def __init__(self, master):
  self.master = master
  self.menubar = Menu(self.master)


        self.casmenu = Menu(self.menubar)
        self.casmenu.choices = Menu(self.casmenu)
        self.casmenu.choices.wierdones = Menu(self.casmenu.choices)
        self.casmenu.choices.wierdones.add_command(label='A')
        self.casmenu.choices.wierdones.add_command(label='B')
        self.casmenu.choices.wierdones.add_command(label='C')
        self.casmenu.choices.wierdones.add_command(label='D')    
        
        self.casmenu.choices.add_command(label='A')
        self.casmenu.choices.add_command(label='B')
        self.casmenu.choices.add_command(label='C')
        self.casmenu.choices.add_command(label='D')
        self.casmenu.choices.add_command(label='E')
        self.casmenu.choices.add_command(label='F')
        self.casmenu.choices.add_cascade(label='G', 
                        menu=self.casmenu.choices.wierdones)

        self.casmenu.add_cascade(label='Scripts',
                                      menu=self.casmenu.choices)

        self.unused = Menu(self.menubar)
        
        self.menubar.add_cascade(label="Cascade Menu", menu=self.casmenu)

  self.top = Toplevel(menu=self.menubar, width=500, relief=RAISED,
                            borderwidth=2)

def main():
    root = Tk()
    root.withdraw()
    app = TestMenu(root)
    root.mainloop()

if __name__ == '__main__':
    main()

Disable a menu

from Tkinter import *

class TestMenu:
    def __init__(self, master):
  self.master = master
  self.menubar = Menu(self.master)

        self.radmenu = Menu(self.menubar)
        self.radmenu.add_radiobutton(label='A')
        self.radmenu.add_radiobutton(label='B')
        self.radmenu.add_radiobutton(label='C')
        self.radmenu.add_radiobutton(label='D')
        self.radmenu.add_radiobutton(label='E')
        self.radmenu.add_radiobutton(label='F')
        self.radmenu.add_radiobutton(label='H')
        self.radmenu.add_radiobutton(label='L')
        self.radmenu.add_radiobutton(label='Z')

        self.menubar.add_cascade(label="Radiobutton Menu", menu=self.radmenu)

        self.menubar.entryconfig(1, state=DISABLED)
  self.top = Toplevel(menu=self.menubar, width=500, relief=RAISED,
                            borderwidth=2)

def main():
    root = Tk()
    root.withdraw()
    app = TestMenu(root)
    root.mainloop()

if __name__ == '__main__':
    main()

Creating a small menu

from Tkinter import *

def callback():
    print "called the callback!"

root = Tk()

menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=callback)
filemenu.add_command(label="Open...", command=callback)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=callback)

helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=callback)

mainloop()

Menu separator 2 and menu action

from Tkinter import *

def callback():
    print "called the callback!"

root = Tk()

menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=callback)
filemenu.add_command(label="Open...", command=callback)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=callback)

helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=callback)

mainloop()

Menu action

from Tkinter import *

def callback():
    print "called the callback!"

root = Tk()

# create a menu
menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=callback)
filemenu.add_command(label="Open...", command=callback)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=callback)

mainloop()

Add menu to a window

from Tkinter import *

def callback():
    print "called the callback!"

root = Tk()

# create a menu
menu = Menu(root)
root.config(menu=menu)

filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=callback)
filemenu.add_command(label="Open...", command=callback)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=callback)

helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=callback)

mainloop()

A Simple Form with Menu

from Tkinter import *             
from tkMessageBox import *        

def notdone():  
    showerror('Not implemented', 'Not yet available') 

def makemenu(parent):
    menubar = Frame(parent)                        
    menubar.pack(side=TOP, fill=X)
    
    fbutton = Menubutton(menubar, text='File', underline=0)
    fbutton.pack(side=LEFT)
    file = Menu(fbutton)
    file.add_command(label='New...',  command=notdone,     underline=0)
    file.add_command(label='Open...', command=notdone,     underline=0)
    file.add_command(label='Quit',    command=parent.quit, underline=0)
    fbutton.config(menu=file)

    ebutton = Menubutton(menubar, text='Edit', underline=0)
    ebutton.pack(side=LEFT)
    edit = Menu(ebutton, tearoff=0)
    edit.add_command(label='Cut',     command=notdone,     underline=0)
    edit.add_command(label='Paste',   command=notdone,     underline=0)
    edit.add_separator()
    ebutton.config(menu=edit)

    submenu = Menu(edit, tearoff=0)
    submenu.add_command(label='Spam', command=parent.quit, underline=0)
    submenu.add_command(label='Eggs', command=notdone,     underline=0)
    edit.add_cascade(label='Stuff',   menu=submenu,        underline=0)
    return menubar

if __name__ == '__main__':
    root = Tk()                   
    root.title('menu_frm')        
    makemenu(root)                 
    msg = Label(root, text='Frame menu basics') 
    msg.pack(expand=YES, fill=BOTH)
    msg.config(relief=SUNKEN, width=40, height=7, bg='beige')
    root.mainloop()

Three Menu inside a form

from Tkinter import * 



def notdone():  
    showerror('Not implemented', 'Not yet available') 

def makemenu(parent):
    menubar = Frame(parent)       
    menubar.pack(side=TOP, fill=X)
    
    fbutton = Menubutton(menubar, text='File', underline=0)
    fbutton.pack(side=LEFT)
    file = Menu(fbutton)
    file.add_command(label='New...',  command=notdone,     underline=0)
    file.add_command(label='Open...', command=notdone,     underline=0)
    file.add_command(label='Quit',    command=parent.quit, underline=0)
    fbutton.config(menu=file)

    ebutton = Menubutton(menubar, text='Edit', underline=0)
    ebutton.pack(side=LEFT)
    edit = Menu(ebutton, tearoff=0)
    edit.add_command(label='Cut',     command=notdone,     underline=0)
    edit.add_command(label='Paste',   command=notdone,     underline=0)
    edit.add_separator()
    ebutton.config(menu=edit)

    submenu = Menu(edit, tearoff=0)
    submenu.add_command(label='Spam', command=parent.quit, underline=0)
    submenu.add_command(label='Eggs', command=notdone,     underline=0)
    edit.add_cascade(label='Stuff',   menu=submenu,        underline=0)
    return menubar



root = Tk()
for i in range(3):                
    frm = Frame()  
    mnu = makemenu(frm)
    mnu.config(bd=2, relief=RAISED)
    frm.pack(expand=YES, fill=BOTH)
    Label(frm, bg='black', height=5, width=15).pack(expand=YES, fill=BOTH)
Button(root, text="Bye", command=root.quit).pack()
root.mainloop()

Framework for a single document interface

from Tkinter import *  
from tkMessageBox import *

def notdone():  
    showerror('Not implemented', 'Not yet available') 

def makemenu(win):
    top = Menu(win)       
    win.config(menu=top)
    
    file = Menu(top)
    file.add_command(label='New...',  command=notdone,  underline=0)
    file.add_command(label='Open...', command=notdone,  underline=0)
    file.add_command(label='Quit',    command=win.quit, underline=0)
    top.add_cascade(label='File',     menu=file,        underline=0)

    edit = Menu(top, tearoff=0)
    edit.add_command(label='Cut',     command=notdone,  underline=0)
    edit.add_command(label='Paste',   command=notdone,  underline=0)
    edit.add_separator()
    top.add_cascade(label='Edit',     menu=edit,        underline=0)

    submenu = Menu(edit, tearoff=0)
    submenu.add_command(label='A', command=win.quit, underline=0)
    submenu.add_command(label='B', command=notdone,  underline=0)
    edit.add_cascade(label='Stuff',   menu=submenu,     underline=0)

if __name__ == '__main__':
    root = Tk()         
    root.title('menu_win')
    makemenu(root)        
    msg = Label(root, text='Window menu basics')
    msg.pack(expand=YES, fill=BOTH)
    msg.config(relief=SUNKEN, width=40, height=7, bg='beige')
    root.mainloop()

3 popup windows with menus

from Tkinter import *



def notdone():  
    showerror('Not implemented', 'Not yet available') 

def makemenu(win):
    top = Menu(win)             
    win.config(menu=top)        
    
    file = Menu(top)
    file.add_command(label='New...',  command=notdone,  underline=0)
    file.add_command(label='Open...', command=notdone,  underline=0)
    file.add_command(label='Quit',    command=win.quit, underline=0)
    top.add_cascade(label='File',     menu=file,        underline=0)

    edit = Menu(top, tearoff=0)
    edit.add_command(label='Cut',     command=notdone,  underline=0)
    edit.add_command(label='Paste',   command=notdone,  underline=0)
    edit.add_separator()
    top.add_cascade(label='Edit',     menu=edit,        underline=0)

    submenu = Menu(edit, tearoff=0)
    submenu.add_command(label='Spam', command=win.quit, underline=0)
    submenu.add_command(label='Eggs', command=notdone,  underline=0)
    edit.add_cascade(label='Stuff',   menu=submenu,     underline=0)


root = Tk()
for i in range(3):              
    win = Toplevel(root)
    makemenu(win)
    Label(win, bg='black', height=5, width=15).pack(expand=YES, fill=BOTH)
Button(root, text="Bye", command=root.quit).pack()
root.mainloop()