Creating Menus in Python Applications by tkinter library
In this tutorial, we will show you how to create menus in the Python applications by tkitner library.
First, the examples will explain how to add a menu. Then we will add menu items as a user pulls/clicks on the menu.
Later, we will also show how to add sub menus inside the main menu.
Actions as you click on the menu item will also be covered in the examples below.
Syntax of creating a menu in tkinter
w = Menu(top, options)
An example of a menu with a single item
Let us start with a simple example of creating a main menu with a single item.
We will create “File” main menu and then it will contain one item “Open”.
As you open and click on the Open menu item, it closes the window.
Have a look at the code and output:
import tkinter as tk
from tkinter import Menu
# window with a menu bar
win = tk.Tk()
win.geometry("450x350")
win.title('Creating a Menu')
# create a menubar
main_menu = Menu(win)
filemenu = Menu(main_menu, tearoff=0)
# Add title of the main menu
main_menu.add_cascade(
label="File",
menu=filemenu
)
# Adding first menu item
filemenu.add_command(
label='Open',
command=win.destroy
)
win.config(menu=main_menu)
win.mainloop()
Output:

Adding more items to the menu example
Let us move ahead and add three items to the “File” menu:
- New
- Open
- Save
Code:
import tkinter as tk
from tkinter import Menu
# window with a menu bar
win = tk.Tk()
win.geometry("450x350")
win.title('Creating a Menu')
# create a menubar
main_menu = Menu(win)
filemenu = Menu(main_menu, tearoff=0)
# Add title of the main menu
main_menu.add_cascade(
label="File",
menu=filemenu
)
#Adding menu items to the File menu
filemenu.add_command(label="New")
filemenu.add_command(label="Open")
filemenu.add_command(label="Save")
win.config(menu=main_menu)
win.mainloop()
Output:

Adding a separator between two menu items example
We will add a separator between each menu item (New, Open, and Save) for the demo only.
To add a separator, use the add_separator() method of the menu widget.
All items simply close the window as you click on any:
Code:
import tkinter as tk
from tkinter import Menu
# window with a menu bar
win = tk.Tk()
win.geometry("450x350")
win.title('Creating a Menu with separator')
# create a menubar
main_menu = Menu(win)
filemenu = Menu(main_menu, tearoff=0)
# Add title of the main menu
main_menu.add_cascade(
label="File",
menu=filemenu
)
#Adding menu items to the File menu
filemenu.add_command(label="New", command=win.destroy)
filemenu.add_separator()
filemenu.add_command(label="Open", command=win.destroy)
filemenu.add_separator()
filemenu.add_command(label="Save", command=win.destroy)
win.config(menu=main_menu)
win.mainloop()
Output:

An example of multiple main menu
Now we will create more main menus like File in the above examples.
In the program below, we have
- File
- Edit
- Format
- View
- Help
These are the main items. Upon clicking on any will open its own menu. But first only the main menus:
Program:
import tkinter as tk
from tkinter import Menu
# window with a menu bar
win = tk.Tk()
win.geometry("450x350")
win.title('Multiple main menu items')
# create a menubar
main_menu = Menu(win)
filemenu = Menu(main_menu, tearoff=0)
editmenu = Menu(main_menu, tearoff=0)
formatmenu = Menu(main_menu, tearoff=0)
viewmenu = Menu(main_menu, tearoff=0)
helpmenu = Menu(main_menu, tearoff=0)
# Add File Menu
main_menu.add_cascade(
label="File",
menu=filemenu
)
# Add Edit Menu
main_menu.add_cascade(
label="Edit",
menu=editmenu
)
# Add Format Menu
main_menu.add_cascade(
label="Format",
menu=formatmenu
)
# Add View Menu
main_menu.add_cascade(
label="View",
menu=viewmenu
)
# Add Help Menu
main_menu.add_cascade(
label="Help",
menu=helpmenu
)
win.config(menu=main_menu)
win.mainloop()
Output:

Adding menu items to each menu
In this example, we will add menu items for each main menu.
Python program:
import tkinter as tk
from tkinter import Menu
# window with a menu bar
win = tk.Tk()
win.geometry("450x350")
win.title('Multiple main menu items')
# create a menubar
main_menu = Menu(win)
filemenu = Menu(main_menu, tearoff=0)
filemenu.add_command(label="New Ctrl+N" )
filemenu.add_command(label="New Window Ctrl+Shift+N" )
filemenu.add_command(label="Open... Ctrl+O" )
filemenu.add_command(label="Save Ctrl+S")
filemenu.add_command(label="Save as... Ctrl++Shift+S")
filemenu.add_separator()
filemenu.add_command(label="Page Setup...")
filemenu.add_command(label="Print...")
filemenu.add_separator()
filemenu.add_command(label="Exit", command=win.destroy)
#Creating Edit Menu Items
editmenu = Menu(main_menu, tearoff=0)
editmenu.add_command(label="Undo" )
editmenu.add_separator()
editmenu.add_command(label="Cut" )
editmenu.add_command(label="Copy" )
editmenu.add_command(label="Paste" )
editmenu.add_command(label="Delete" )
#Creating Format Menu Items
formatmenu = Menu(main_menu, tearoff=0)
formatmenu.add_command(label="Word Wrap" )
formatmenu.add_command(label="Font..." )
#Creating View Menu Items
viewmenu = Menu(main_menu, tearoff=0)
viewmenu.add_command(label="Zoom" )
viewmenu.add_command(label="Status Bar" )
#Creating Help Menu Items
helpmenu = Menu(main_menu, tearoff=0)
helpmenu.add_command(label="View Help" )
helpmenu.add_command(label="Send Feedback" )
# Add File Menu
main_menu.add_cascade(
label="File",
menu=filemenu
)
# Add Edit Menu
main_menu.add_cascade(
label="Edit",
menu=editmenu
)
# Add Format Menu
main_menu.add_cascade(
label="Format",
menu=formatmenu
)
# Add View Menu
main_menu.add_cascade(
label="View",
menu=viewmenu
)
# Add Help Menu
main_menu.add_cascade(
label="Help",
menu=helpmenu
)
win.config(menu=main_menu)
win.mainloop()
Output:

An example of creating a sub-menu
If your menu is supposed to be multi-level i.e. sub-menu then you can do this easily by using tkinter menu widget.
For example, in our above menu, we want to add the “Zoom In” and “Zoom Out” sum menu items to the “Zoom” menu item. This is how we can do this:
Code:
import tkinter as tk
from tkinter import Menu
# window with a menu bar
win = tk.Tk()
win.geometry("450x350")
win.title('Multiple main menu items')
# create a menubar
main_menu = Menu(win)
filemenu = Menu(main_menu, tearoff=0)
filemenu.add_command(label="New Ctrl+N" )
filemenu.add_command(label="New Window Ctrl+Shift+N" )
filemenu.add_command(label="Open... Ctrl+O" )
filemenu.add_command(label="Save Ctrl+S")
filemenu.add_command(label="Save as... Ctrl++Shift+S")
filemenu.add_separator()
filemenu.add_command(label="Page Setup...")
filemenu.add_command(label="Print...")
filemenu.add_separator()
filemenu.add_command(label="Exit", command=win.destroy)
#Creating Edit Menu Items
editmenu = Menu(main_menu, tearoff=0)
editmenu.add_command(label="Undo" )
editmenu.add_separator()
editmenu.add_command(label="Cut" )
editmenu.add_command(label="Copy" )
editmenu.add_command(label="Paste" )
editmenu.add_command(label="Delete" )
#Creating Format Menu Items
formatmenu = Menu(main_menu, tearoff=0)
formatmenu.add_command(label="Word Wrap" )
formatmenu.add_command(label="Font..." )
#Creating View Menu Items
viewmenu = Menu(main_menu, tearoff=0)
#viewmenu.add_command(label="Zoom" )
viewmenu.add_command(label="Status Bar" )
#Sub menu for Zoom menu item
sub_zoom = Menu(main_menu, tearoff=0)
sub_zoom.add_command(label='Zoom In')
sub_zoom.add_command(label='Zoom Out')
#Add sub menu for zoom item
viewmenu.add_cascade(
label="Zoom",
menu=sub_zoom
)
#Creating Help Menu Items
helpmenu = Menu(main_menu, tearoff=0)
helpmenu.add_command(label="View Help" )
helpmenu.add_command(label="Send Feedback" )
# Add File Menu
main_menu.add_cascade(
label="File",
menu=filemenu
)
# Add Edit Menu
main_menu.add_cascade(
label="Edit",
menu=editmenu
)
# Add Format Menu
main_menu.add_cascade(
label="Format",
menu=formatmenu
)
# Add View Menu
main_menu.add_cascade(
label="View",
menu=viewmenu
)
# Add Help Menu
main_menu.add_cascade(
label="Help",
menu=helpmenu
)
win.config(menu=main_menu)
win.mainloop()
Output:

Coloring the menu
The menu widget has options to give background and foreground colors to the menu.
- By using bg option, you may specify the background color.
- The fg option is used to color the text of the menu items.
See the example below where we added both options. In fg, we provided the color name and in the bg option we used the Hex value of the color:
Code:
import tkinter as tk
from tkinter import Menu
def closewin():
filewin = Toplevel(root)
button = Button(filewin, text="Do nothing button")
button.pack()
# window with a menu bar
win = tk.Tk()
win.geometry("450x350")
win.title('Menu with bg and fg options')
# create a menubar
main_menu = Menu(win)
#Here we specify the file menu bg and fg colors
filemenu = Menu(main_menu, tearoff=0, bg="#346767", fg = "yellow")
# Add title of the main menu
main_menu.add_cascade(
label="File",
menu=filemenu
)
#Adding menu items to the File menu
filemenu.add_command(label="New", command=win.destroy)
filemenu.add_separator()
filemenu.add_command(label="Open", command=win.destroy)
filemenu.add_separator()
filemenu.add_command(label="Save", command=win.destroy)
win.config(menu=main_menu)
win.mainloop()
Output:

Changing color as the mouse hovers over a menu item
To stand out a menu item from others when the mouse hovers over that item, use the following two options of the menu widget:
- activebackground – to set the background color as mouse hovers
- activeforeground – set the text color
See an example below where we set these options for all three menu items.
Code:
import tkinter as tk
from tkinter import Menu
def closewin():
filewin = Toplevel(root)
button = Button(filewin, text="Do nothing button")
button.pack()
# window with a menu bar
win = tk.Tk()
win.geometry("450x350")
win.title('Menu with bg and fg options')
# create a menubar
main_menu = Menu(win)
#Here we specify the file menu bg and fg colors
filemenu = Menu(main_menu, tearoff=0, bg="#346767", fg = "yellow")
# Add title of the main menu
main_menu.add_cascade(
label="File",
menu=filemenu
)
#Adding menu items to the File menu
filemenu.add_command(label="New", command=win.destroy, activebackground="#800080", activeforeground="white")
filemenu.add_separator()
filemenu.add_command(label="Open", command=win.destroy, activebackground="#800080", activeforeground="white")
filemenu.add_separator()
filemenu.add_command(label="Save", command=win.destroy, activebackground="#800080", activeforeground="white")
win.config(menu=main_menu)
win.mainloop()
Output:
