Tentacle
A Qt marking-menu launcher for DCC apps.
Built on uitk.MarkingMenu, it ships ~60 Maya tool panels spanning the full pipeline (modeling, UV, materials, rigging, animation, rendering, …) — a starting set you can build on, or replace wholesale with your own — a Blender integration slot library is in progress, and a thin 3ds Max wrapper exists to build on.
Install
Download tentacle_installer.py — one file for every DCC, no administrator rights, nothing to type:
| DCC | Do this |
|---|---|
| Maya 2025+ | Drag the file into the viewport. |
| Blender 4.1+ | Edit ▸ Preferences ▸ Add-ons ▸ Install from Disk… (under the ⌄ menu; Install… on 4.1), pick the file, and tick Tentacle Marking Menu if it is not already on. |
The first start fetches tentacletk and the engine for your host (mayatk / blendertk; Blender also gets PySide6) from PyPI — about a minute, with progress in the host — and the menu is live: hover the viewport and hold Z. Everything lands in a per-user folder the host already imports from (<Maya prefs>/<version>/tentacle/, Blender's scripts/addons/modules/); the DCC's own install is never touched. The DCC's Python needs to reach PyPI (proxy / firewall).
Update or uninstall: drop the file in again (Maya) or open the add-on's preferences (Blender). Either applies at the next start if the menu is already running. In Blender use the add-on's own Uninstall: Blender's Remove button deletes only the add-on file and leaves the packages in scripts/addons/modules/. Settings brought over from an older Blender with Load Previous Settings can carry packages built for that version's Python. The first start on the new version reinstalls them, and so does Update.
Scripted, no UI: "<mayapy>" tentacle_installer.py install|update|uninstall · blender --background --python tentacle_installer.py -- install|update|uninstall (exit code 1 when the verb failed, an install that did not take included). Developers: pip install "tentacletk[maya]" / "tentacletk[blender]" into the DCC's own Python, or pip install -e ./tentacle from a checkout (see Development); the extra in brackets is the engine — plain tentacletk has none and the menu will not start.
Activation key
Z by default. Change it any time from the in-app Preferences panel.
Starting Tentacle from your own startup script is two lines — Tcl.launch detects the host and defers startup however that host needs — and key_show names the default it starts with:
from tentacle import Tcl
Tcl.launch(key_show="Z") # bare ("Z", "Space") or Qt-named ("Key_F11")
Maya: userSetup.py (in ~/Documents/maya/<version>/scripts/); Blender: startup.py in %APPDATA%\Blender Foundation\Blender\<version>\scripts\startup\. Tcl.launch recognizes 3ds Max too and starts TclMax there — the menu opens, but its slot library isn't ported yet, so the panels have no behavior wired. See Platform support.
Bindings
Holding the activation key opens a menu; adding mouse buttons picks which one. Shown with the default Z:
| Chord | Opens |
|---|---|
Z |
hud#startmenu |
Z + LMB |
cameras#startmenu |
Z + MMB |
editors#startmenu |
Z + RMB |
main#startmenu |
Z + LMB + RMB |
maya#startmenu |
(In Blender the both-button chord opens blender#startmenu — the native menu sets.)
To change the activation key later, use the in-app Preferences panel or the shortcut editor's Show Marking Menu row — or, in Blender, Preferences ▸ Keymap ▸ 3D View ▸ Tentacle Marking Menu. Either way the whole chord table moves with it and the choice is remembered, outranking the key_show default your launch script names.
The table is built in tcl.py; chord syntax, gesture mechanics, and the full customization surface are covered in uitk/docs/MARKING_MENU.md.
How it works
flowchart LR
A[Tcl.launch → 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
Tcl.launch forwards anything extra to the DCC's entry class:
Tcl.launch(
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.py Tcl.launch — host detection + the shared activation-key/chord contract
├── tcl_maya.py TclMaya entry point
├── tcl_max.py TclMax (wrapper, no slot library yet)
├── tcl_blender.py TclBlender entry point — Qt host + keymap bridge + launcher + add-on
├── slots/
│ ├── _slots.py Slots base — repeat-last-command shortcut
│ ├── maya/ ~60 SlotsMaya subclasses
│ └── blender/ SlotsBlender subclasses (Phase 3+)
└── ui/ .ui definitions; maya_menus/ + blender_menus/ hold DCC submenus
Platform support
| DCC | Status |
|---|---|
| Maya 2025+ | Full — entry point, slot library, all menus wired. |
| Blender | Entry point + keymap activation live (TclBlender); slot port in progress. |
| 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
Metadata
Release files for tentacletk 0.14.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tentacletk-0.14.2-py3-none-any.whl | Python 3 | none | any | Details |
Release files / tentacletk-0.14.2-py3-none-any.whl
| Download URL | tentacletk-0.14.2-py3-none-any.whl |
|---|---|
| Size | 655.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
379de9615a45841c2bd2738a888d92cce07d5940aea97651503792eba143e963
|
|
BLAKE2b-256 checksum How to use checksums |
bf545d1612c4cbc50042f36b3ade3ecb0c277ff7dd762ec6d10fba995cc47bed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Security for tentacletk 0.14.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.