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

Install from a command prompt, into your DCC's own Python (not a system install). The commands below name specific versions — adjust the paths to match yours.

Maya (2025+) — install into mayapy:

"C:/Program Files/Autodesk/Maya2025/bin/mayapy.exe" -m pip install tentacletk

Blender (4.x+) — same package, into Blender's bundled Python:

"C:/Program Files/Blender Foundation/Blender 5.1/5.1/python/bin/python.exe" -m pip install tentacletk

Prefer a menu? Download and run the package manager for your DCC — mayapy-package-manager.bat / blenderpy-package-manager.bat — pick your DCC version, choose Install Package, type tentacletk.

Launch

The same two lines start Tentacle in any supported DCC — Tcl.launch detects the host and defers startup however that host needs:

from tentacle import Tcl
Tcl.launch(key_show="Z")

key_show is the key you hold to open the menu. Pick one now — bare ("Z", "Space") or Qt-named ("Key_F11") — since while Tentacle is running its key takes precedence over the DCC's own binding on that key.

Naming a key sets the default: it applies on a first run and for as long as you haven't picked a key yourself. A key you set from the UI (Bindings) is remembered and takes precedence over it from then on. With no argument the default is Z.

Save the snippet where your DCC looks for startup code:

DCC Put it in
Maya userSetup.py (in ~/Documents/maya/<version>/scripts/)
Blender startup.py in %APPDATA%\Blender Foundation\Blender\<version>\scripts\startup\

Restart the DCC, hover the viewport, and hold your key.

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.56

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

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

Download URL tentacletk-0.13.56-py3-none-any.whl
Size 552.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
15817cab9326aff1fdbfd290284a429acff2ce6d51004dd67a511c4c88f6a85b
BLAKE2b-256 checksum
How to use checksums
4ef5fe36e7ce55ccadaf9a0c9ca08748c2462fece4ebeb94f22f4993ffe8893e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.15

Release history Release notifications | RSS feed

0.13.91

1 release file

0.13.90

1 release file

0.13.89

1 release file

0.13.88

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

This release

0.13.56 This release

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