New 0.9.7 — rounded completer popups

Docking that looks
as good as it works.

Lace is an advanced docking system for PySide6. Tabbed dock areas, floating windows, auto-hide sidebars and saved layouts — drawn by a theme engine that makes every panel, menu and dialog of your Qt app match.

$ pip install lace-dock
  • Python 3.11+
  • PySide6 / Qt 6
  • Apache-2.0
The Lace demo app: dock areas with tabs, a sidebar and a calendar, in the Tokyo Night theme
Tokyo Night
37built-in themes
19configuration flags
1,800+tests
0platform colours leaking through

Features

Everything a pro desktop layout needs.

Built for IDEs, lab software, dashboards and editors — apps where people arrange their own workspace and come back to it every day.

Dock anywhere

Left, right, top, bottom or as a tab. Nested splitters, reorderable tabs, maximize and restore any area.

Floating windows

Tear any panel out into its own window and drag it back. Native or frameless chrome with snap, shadow and resize borders.

Auto-hide sidebars

VS Code-style slide-out panels with notification badges. Pin, unpin, and drag panels out of the sidebar again.

OKLCH theme engine

37 themes derived in OKLCH, held to WCAG contrast floors, and switched live. Follows the OS light/dark setting if you want it to.

Layouts & perspectives

Save the whole workspace to JSON — atomically — and switch between named perspectives like “Coding” or “Review”.

Themed dialogs

Message boxes, input, colour and file dialogs with your theme's title bar — drop-in for Qt's static helpers.

Drag & drop

Drop targets that show you exactly where it lands.

Drag a tab or a floating window and Lace overlays a cross over the area under the cursor and the edges of the window, previewing the split before you let go. Per-widget flags decide what can be closed, moved, floated or pinned.

Drop indicators over a dock area while a window is dragged

Sidebars

Panels out of the way until you need them.

Pin any dock widget to an edge. It folds into a vertical tab — with a badge for unread items — and slides out over the layout on click, keeping or handing back keyboard focus as you configure.

A pinned panel slid out from the right sidebar

Themes

One switch. Every pixel follows.

Docks, tabs, menus, scroll bars, title bars and the full QPalette — Active, Inactive and Disabled — all change together. Here are seventeen of the 37, including the editor classics.

The demo app in the selected theme

Derived, not hand-picked

Two seed colours and a chassis make a theme. Surfaces step evenly in OKLCH; text holds its contrast.

Theme Studio

python -m lace.theme_kit studio edits a theme live, audits contrast and exports JSON.

Ship your own

Load JSON themes validated by Pydantic, or define a ThemeSpec with your colours and geometry.

New in 0.9

Dialogs that belong to your app.

A stock Qt message box breaks the look with a system title bar. lace.dialogs mirrors Qt's static functions — same arguments, same return values — but each dialog carries your theme's title bar. Build your own with FramelessLaceDialog.

  • Message boxes: information, question, warning, critical, about
  • Text, item, integer and decimal input
  • Colour picker, and Qt or native file dialogs
  • System-framed windows still get the theme's caption colour on Windows 11
A themed question dialog in the Light theme
A themed question dialog in the Tokyo Night theme

Code

A docking window in twenty lines.

Lace's API is plain Python on top of PySide6. Create a manager, add widgets, pick a theme.

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QTextEdit
from lace import (DockManager, DockWidget, DockWidgetArea, DockWidgetFeature,
                  LaceStyle, apply_dock_theme)

app = QApplication(sys.argv)
app.setStyle(LaceStyle())

window = QMainWindow()
window.resize(1200, 800)

# The dock manager becomes the window's central widget
dock_manager = DockManager(window)
apply_dock_theme("tokyo_night")

editor = DockWidget("Editor", window)
editor.set_widget(QTextEdit())
editor.set_features(DockWidgetFeature.all_features)
dock_manager.add_dock_widget(DockWidgetArea.center, editor)

window.show()
app.exec()

Give your Qt app a workspace.

Clone the repo and run the demo to try every feature, then drop Lace into your own window.

$ git clone https://github.com/opticsWolf/Lace && cd Lace && pip install -e . && python -m demos.demo_app