Menu & EnumProperty

What I am trying to do is have a menu where the options on the menu are ‘dynamically’ populated, instead of having an operator for each selection. I’ve found this method which does what I want.

However instead of listing the individual items in the enum operator like this:

    enum_items = (
        ("item1", "Item 1", "Description 1"),
        ("item2", "Item 2", "Description 2"),
        ("item3", "Item 3", "Description 3"),

I want the contents to be populated by a list, in this case all objects which are inside a specific named collection:

    for obj in["Collection"].all_objects:
        cubes =,, 

This is what it prints:

('Cube', 'Cube', 'Cube')
('Cube.001', 'Cube.001', 'Cube.001')
('Cube.002', 'Cube.002', 'Cube.002')

But at the end of each row, I somehow need to get a comma in there so that it follows the required structure of enum_items. So… how do I do that? Otherwise the enum only sees the first line (Cube) and ignores the other two.

Example .blend attached and full test code below:

menutest.blend (800.5 KB)

import bpy

class SimpleCustomMenu(bpy.types.Menu):
    bl_label = "Simple Custom Menu"
    bl_idname = "OBJECT_MT_simple_custom_menu"

    def draw(self, context):
        layout = self.layout
        layout.operator_enum("object.some_operator", "action")

def generate_enum(self, context):

    for obj in["Collection"].all_objects:
        cubes =,, 
        enum = (cubes,)        
        return enum

class OBJECT_OT_some_operator(bpy.types.Operator):
    bl_idname = "object.some_operator"
    bl_label = "Some Operator"

    action: bpy.props.EnumProperty(items=generate_enum)

    def execute(self, context):
        ObjList = [ 'Cube', 'Cube.001', 'Cube.002' ]     
        for obj in ObjList:
  [obj].hide_viewport = True
  [obj].hide_render = True
               [self.action].hide_viewport = False[self.action].hide_render = False       

        return {'FINISHED'}

if __name__ == "__main__":

Ah, I should have just read the post I linked a little harder! This works…

    enum = []

    for obj in["Collection"].all_objects:
        id_ = str( 
        name = id_ 
        desc = "Description " + str( 
        enum.append((id_, name, desc,))
    return enum

Now to figure out other problems :slight_smile: