Skip to main content

Tests License: LGPL v3 PyPI Platform

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.

Demo

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

License

LGPL v3.

Metadata

Release files for tentacletk 0.14.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for tentacletk 0.14.6
File Interpreter ABI Platform
tentacletk-0.14.6-py3-none-any.whl Python 3 none any Details

Release files / tentacletk-0.14.6-py3-none-any.whl

Download URL tentacletk-0.14.6-py3-none-any.whl
Size 668.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
112dfd32d9e440325ce47cb19fa7a4a4d27b5c63ef50873feebed27140d0cd97
BLAKE2b-256 checksum
How to use checksums
a2f34db56a98d6e645a83656bd8c1618c647218d4655216bdb8cb69cfeda87ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.17

Security for tentacletk 0.14.6

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.

Release history Release notifications | RSS feed

This release

0.14.6 This release

1 release file No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page