# Menu(bpy_struct)

## Basic Menu Example

Here is an example of a simple menu. Menus differ from panels in that they must reference from a header, panel or another menu.

Notice the ‘CATEGORY_MT_name’ in `Menu.bl_idname`, this is a naming convention for menus.

Note

Menu subclasses must be registered before referencing them from blender.

Note

Menus have their `Layout.operator_context` initialized as ‘EXEC_REGION_WIN’ rather than ‘INVOKE_DEFAULT’ (see Execution Context). If the operator context needs to initialize inputs from the `Operator.invoke` function, then this needs to be explicitly set.

    import bpy

    class BasicMenu(bpy.types.Menu):
        bl_idname = "OBJECT_MT_select_test"
        bl_label = "Select"

        def draw(self, context):
            layout = self.layout

            layout.operator("object.select_all", text="Select/Deselect All").action = 'TOGGLE'
            layout.operator("object.select_all", text="Inverse").action = 'INVERT'
            layout.operator("object.select_random", text="Random")

    bpy.utils.register_class(BasicMenu)

    # test call to display immediately.
    bpy.ops.wm.call_menu(name="OBJECT_MT_select_test")

## Submenus

This menu demonstrates some different functions.

    import bpy

    class SubMenu(bpy.types.Menu):
        bl_idname = "OBJECT_MT_select_submenu"
        bl_label = "Select"

        def draw(self, context):
            layout = self.layout

            layout.operator("object.select_all", text="Select/Deselect All").action = 'TOGGLE'
            layout.operator("object.select_all", text="Inverse").action = 'INVERT'
            layout.operator("object.select_random", text="Random")

            # access this operator as a submenu
            layout.operator_menu_enum("object.select_by_type", "type", text="Select All by Type...")

            layout.separator()

            # expand each operator option into this menu
            layout.operator_enum("object.lamp_add", "type")

            layout.separator()

            # use existing memu
            layout.menu("VIEW3D_MT_transform")

    bpy.utils.register_class(SubMenu)

    # test call to display immediately.
    bpy.ops.wm.call_menu(name="OBJECT_MT_select_submenu")

## Extending Menus

When creating menus for addons you can’t reference menus in Blender’s default scripts. Instead, the addon can add menu items to existing menus.

The function menu_draw acts like `Menu.draw`.

    import bpy

    def menu_draw(self, context):
        self.layout.operator("wm.save_homefile")

    bpy.types.INFO_MT_file.append(menu_draw)

base class — `bpy_struct`

subclasses — `GPENCIL_PIE_settings_palette`, `GPENCIL_PIE_tool_palette`, `GPENCIL_PIE_tools_more`

class `bpy.types.``Menu`(bpy_struct)

  Editor menu containing buttons

  `bl_description`

    Type: | string, default “”

  `bl_idname`

    If this is set, the menu gets a custom ID, otherwise it takes the name of the class used to define the menu (for example, if the class name is “OBJECT_MT_hello”, and bl_idname is not set by the script, then bl_idname = “OBJECT_MT_hello”)

    Type: | string, default “”, (never None)

  `bl_label`

    The menu label

    Type: | string, default “”, (never None)

  `bl_translation_context`

    Type: | string, default “*”, (never None)

  `layout`

    Defines the structure of the menu in the UI

    Type: | `UILayout`, (readonly)

  classmethod `poll`(context)

    If this method returns a non-null output, then the menu can be drawn

    Return type: | boolean

  `draw`(context)

    Draw UI elements into the menu UI layout

  `draw_preset`(context)

    Define these on the subclass: - preset_operator (string) - preset_subdir (string)

    Optionally: - preset_extensions (set of strings) - preset_operator_defaults (dict of keyword args)

  `path_menu`(searchpaths, operator, props_default=None, filter_ext=None)

Inherited Properties

`bpy_struct.id_data` |

Inherited Functions

`bpy_struct.as_pointer` `bpy_struct.driver_add` `bpy_struct.driver_remove` `bpy_struct.get` `bpy_struct.is_property_hidden` `bpy_struct.is_property_readonly` `bpy_struct.is_property_set` `bpy_struct.items` | `bpy_struct.keyframe_delete` `bpy_struct.keyframe_insert` `bpy_struct.keys` `bpy_struct.path_from_id` `bpy_struct.path_resolve` `bpy_struct.property_unset` `bpy_struct.type_recast` `bpy_struct.values`