C4D GUI Python Callback
- 
Hi Folks,
We trying to call a python script from the menu bar.
From in this example
https://developers.maxon.net/docs/py/2023_2/misc/pluginstructure.html?highlight=pluginmessage#PluginMessage
a python script can be attached to a container viamenu.InsData(c4d.MENURESOURCE_COMMAND, "IDM_NEU")*
To attach an external python script to a button of the menu I needs to be registered as a plugin
with a unique plugin ID (e.G. 123456)menu.InsData(c4d.MENURESOURCE_COMMAND, "PLUGIN_CMD_123456")
Does this mean for each button added to the menu bar, you have to register a new plugin with a unique ID in order to attach a callback to it ?
Or is there a more convenient way of doing this ?*e.G. menu.InsData(c4d.MENURESOURCE_COMMAND, callbackFunction(args))
Thank for your help
 - 
Hi and welcome to the new Plugin Cafe!
It is not possible to pass a Python function for
MENURESOURCE_COMMAND. Only a Cinema 4D command resource ID ("IDM_NEU") or a plugin command ID ("PLUGIN_CMD_123456") can be given.A
CommandDataplugin can have sub-ID commands returned fromGetSubContainer(). The sub-ID commands are then invoked withExecuteSubID().
But there's a limitation with this currently. At least twoCommandDatahave to be registered from the same plugin for the sub-commands to be taken into account.Please read and use How to Post Questions and Q&A New Functionality. This time I added tags and turned the thread into a Q&A.
 - 
Hey,
thank you for the reply.
I managed to implement theGetSubContainer()andExecuteSubID()function.However what I don’t get to work is; How you would you specify the displayed names of the commands ?
Before when registering multiple commands, the name was specified in the same step
e.G.
```
c4d.plugins.RegisterCommandPlugin(id=“PLUGIN_CMD_123456”, str=‘New Command’, info=0, icon=None, help="", dat=self.__callBackInstance)From the docs the [CommandData.GetSubContainer()](https://developers.maxon.net/docs/py/2023_2/modules/c4d.plugins/BaseData/CommandData/index.html#CommandData.GetSubContainer) looks like the `BaseContainer.SetString(id, s) ` function would do something like that.bc = BaseContainer()
bc.SetString(1, "Submenu Test")
bc.SetString(1000, "First Entry")
submenu.InsData(0, bc)But I am not entirely sure. What would be the correct way to pass the command to the container and specify their names ? thanks in advance and get busy cafe :) - 
Hi,
A string with format "PLUGIN_CMD_123456" is meant to be used with
MENURESOURCE_COMMAND, notRegisterCommandPlugin().
It tells Cinema the command ID and name for the menu item to be added.
Note the sub-IDs returned fromGetSubContainer()are specific to a command and aren't global to Cinema.Maybe
CommandDataisn't what you really need. Scripts from the user folder are automatically loaded and can be added to any menu using Customize Menus dialog.