Skip to main content

Tests License: LGPL v3 PyPI

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.

Scripted, no UI: "<mayapy>" tentacle_installer.py install|update|uninstall · blender --background --python tentacle_installer.py -- install|update|uninstall. 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 ▸ Keymap3D ViewTentacle 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.

Release files for tentacletk 0.13.88

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.13.88
File Interpreter ABI Platform
tentacletk-0.13.88-py3-none-any.whl Python 3 none any Details

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

Download URL tentacletk-0.13.88-py3-none-any.whl
Size 649.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
14fcef09f46a31696e862fcdca44a874fe8958371035bbdf185552da5c87d42e
BLAKE2b-256 checksum
How to use checksums
e7e97f35d7f57a4d48043c751b0d5425992fad6c8db3878568d21e0122cd189b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.16

Release history Release notifications | RSS feed

0.13.91

1 release file

0.13.90

1 release file

0.13.89

1 release file

This release

0.13.88 This release

1 release file

0.13.87

1 release file

0.13.86

1 release file

0.13.85

1 release file

0.13.78

1 release file

0.13.77

1 release file

0.13.76

1 release file

0.13.75

1 release file

0.13.72

1 release file

0.13.66

1 release file

0.13.64

1 release file

0.13.61

1 release file

0.13.59

1 release file

0.13.56

1 release file

0.13.53

1 release file

0.13.33

1 release file

0.13.29

1 release file

0.13.26

1 release file

0.13.22

1 release file

0.13.20

1 release file

0.13.16

1 release file

0.13.14

1 release file

0.13.10

1 release file

0.13.6

1 release file

0.13.3

1 release file

0.12.99

1 release file

0.12.95

1 release file

0.12.91

1 release file

0.12.88

1 release file

0.12.84

1 release file

0.12.80

1 release file

0.12.51

1 release file

0.12.48

1 release file

0.12.45

1 release file

0.12.42

1 release file

0.12.39

1 release file

0.12.36

1 release file

0.12.34

1 release file

0.12.30

1 release file

0.12.27

1 release file

0.12.25

1 release file

0.12.8

1 release file

0.12.5

1 release file

0.12.4

1 release file

0.12.3

1 release file

0.12.0

1 release file

0.11.99

1 release file

0.11.95

1 release file

0.11.94

1 release file

0.11.93

1 release file

0.11.92

1 release file

0.11.88

1 release file

0.11.84

1 release file

0.11.79

1 release file

0.11.75

1 release file

0.11.70

1 release file

0.11.66

1 release file

0.11.62

1 release file

0.11.59

1 release file

0.11.56

1 release file

0.11.52

1 release file

0.11.48

1 release file

0.11.44

1 release file

0.11.40

1 release file

0.11.36

1 release file

0.11.32

1 release file

0.11.29

1 release file

0.11.25

1 release file

0.11.21

1 release file

0.11.17

1 release file

0.11.9

1 release file

0.11.5

1 release file

0.11.1

1 release file

0.10.77

1 release file

0.10.75

1 release file

0.10.74

1 release file

0.10.72

1 release file

0.10.70

1 release file

0.10.68

1 release file

0.10.65

1 release file

0.10.60

1 release file

0.10.56

1 release file

0.10.38

1 release file

0.10.33

1 release file

0.10.30

1 release file

0.10.25

1 release file

0.10.21

1 release file

0.10.13

1 release file

0.10.12

1 release file

0.10.9

1 release file

0.10.6

1 release file

0.10.1

1 release file

0.9.101

1 release file

0.9.97

1 release file

0.9.92

1 release file

0.9.89

1 release file

0.9.78

1 release file

0.9.77

1 release file

0.9.76

1 release file

0.9.75

1 release file

0.9.74

1 release file

0.9.73

1 release file

0.9.72

1 release file

0.9.71

1 release file

0.9.70

1 release file

0.9.69

1 release file

0.9.68

1 release file

0.9.67

1 release file

0.9.66

1 release file

0.9.64

1 release file

0.9.63

1 release file

0.9.62

1 release file

0.9.61

1 release file

0.9.60

1 release file

0.9.59

1 release file

0.9.58

1 release file

0.9.57

1 release file

0.9.56

1 release file

0.9.55

1 release file

0.9.54

1 release file

0.9.53

1 release file

0.9.52

1 release file

0.9.51

1 release file

0.9.50

1 release file

0.9.49

1 release file

0.9.48

1 release file

0.9.47

1 release file

0.9.46

1 release file

0.9.45

2 release files

0.9.44

2 release files

0.9.43

2 release files

0.9.42

2 release files

0.9.41

2 release files

0.9.38

2 release files

0.9.37

2 release files

0.9.36

2 release files

0.9.35

2 release files

0.9.34

2 release files

0.9.29

2 release files

0.9.26

2 release files

0.9.25

2 release files

0.9.24

2 release files

0.9.22

2 release files

0.9.21

2 release files

0.9.20

2 release files

0.9.19

2 release files

0.9.17

2 release files

0.9.16

2 release files

0.9.15

2 release files

0.9.14

2 release files

0.9.13

2 release files

0.9.12

2 release files

0.9.11

2 release files

0.9.10

2 release files

0.9.9

2 release files

0.9.8

2 release files

0.9.7

2 release files

0.9.6

2 release files

0.9.5

2 release files

0.9.4

2 release files

0.9.3

2 release files

0.9.2

2 release files

0.9.1

2 release files

0.9.0

2 release files

0.8.9

2 release files

0.8.8

2 release files

0.8.7

2 release files

0.8.6

2 release files

0.8.5

2 release files

0.8.4

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.9

2 release files

0.7.8

2 release files

0.7.7

2 release files

0.7.6

2 release files

0.7.5

2 release files

0.7.4

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.9

2 release files

0.6.6

2 release files

0.6.5

2 release files

0.6.4

2 release files

0.6.3

2 release files

0.6.2

2 release files

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