A multi-application marking menu and UI framework for Maya, 3ds Max, and Blender.
Project description
Tentacle
A Qt marking-menu (pie-menu) launcher for DCC apps. Hold a hotkey, flick toward a wedge, release — the tool runs. Submenus open along the gesture path.
Tentacle is the Maya-flavored shell on top of uitk.MarkingMenu. It ships ~55 Maya tool panels (modeling, UV, materials, rigging, animation, rendering, …) and wrapper entry points for Blender and 3ds Max.
Install
"C:/Program Files/Autodesk/Maya2025/bin/mayapy.exe" -m pip install tentacletk
Or use the bundled mayapy package manager — pick your Maya version, press 1, type tentacletk.
Requires Python 3.9+ and Qt via qtpy (PySide2 or PySide6). The upstream toolkit packages pythontk, uitk, and mayatk are pulled in automatically.
Launch
In Maya's userSetup.py:
from maya.utils import executeDeferred
def start_tentacle():
from tentacle import TclMaya
TclMaya(key_show="Z")
executeDeferred(start_tentacle)
key_show accepts bare keys ("Z", "Space") or Qt names ("Key_Z").
Default bindings
Defined in tcl_maya.py; chords are parsed by uitk.MarkingMenu (see uitk/docs/MARKING_MENU.md).
| Chord | Opens |
|---|---|
Z |
hud#startmenu |
Z + LMB |
cameras#startmenu |
Z + MMB |
editors#startmenu |
Z + RMB |
main#startmenu |
Z + LMB + RMB |
maya#startmenu |
Ctrl+Shift+R repeats the last command (configurable in Preferences).
How it works
flowchart LR
A[TclMaya] --> B[uitk.MarkingMenu]
B --> C[uitk.Switchboard]
C --> D[ui/*.ui]
C --> E[slots/maya/*.py]
uitk.Switchboard pairs each .ui file with a slot module of the same basename, then connects each widget's objectName to a method of the same name on the slot class:
ui/materials.ui ──pairs with──► slots/maya/materials.py
└─ widget objectName "b005" ──calls──► def b005(self): ...
└─ widget objectName "b005" ──setup──► def b005_init(self, widget): ... (optional)
That's the whole convention. Widget object names are arbitrary; whatever name a widget has, a method of that name on the slot class will fire when it's interacted with.
Submenu routing: a widget's accessibleName (e.g. "cameras#lower") names the submenu UI to open when the gesture lands on it.
Customization
TclMaya(
key_show="F11",
slot_source="my_studio/slots", # use your own slot library
log_level="DEBUG",
bindings={ # replace defaults entirely
"Key_F11": "main#startmenu",
"Key_F11|RightButton": "cameras#startmenu",
},
)
User preferences (theme, repeat-last shortcut, etc.) live in the in-app Preferences panel.
Project layout
tentacle/
├── tcl_maya.py TclMaya entry point + default bindings
├── tcl_max.py TclMax (wrapper, no slot library yet)
├── tcl_blender.py TclBlender (wrapper, no slot library yet)
├── slots/
│ ├── _slots.py Slots base — repeat-last-command shortcut
│ └── maya/ ~55 SlotsMaya subclasses
└── ui/ .ui definitions; maya_menus/ holds Maya submenus
Platform support
| DCC | Status |
|---|---|
| Maya 2025+ | Full — entry point, slot library, all menus wired. |
| Blender | Wrapper only (TclBlender). |
| 3ds Max | Wrapper only (TclMax). |
Development
git clone https://github.com/m3trik/tentacle
pip install -e ./tentacle
cd tentacle && python -m pytest test/
CI runs test_package.py, test_slot_integrity.py, test_ui_integrity.py, and module-specific suites — see .github/workflows/tests.yml.
More
API_REGISTRY.md— every public class/method, with file:line links.CHANGELOG.md— notable changes.CLAUDE.md— contributor conventions.uitk/docs/MARKING_MENU.md— chord syntax, gesture mechanics.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tentacletk-0.11.17-py3-none-any.whl.
File metadata
- Download URL: tentacletk-0.11.17-py3-none-any.whl
- Upload date:
- Size: 246.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f5c06c381c92475aee3832977a8dd93cbb26302855a095aca133b05579d7fb5
|
|
| MD5 |
ded2a50114cba678f3500461a4cb879b
|
|
| BLAKE2b-256 |
54456872393c3d1d0a428530b15eee77caea380f4e4dd825a1fb4d9a77114319
|