Skip to main content

Slint Python integration

Project description

Slint-python (Beta)

Slint is a UI toolkit that supports different programming languages. Slint-python is the integration with Python.

Warning Slint-python is in a beta phase of development: The APIs while mostly stable, may be subject to further changes. Any changes will be documented in the ChangeLog.

You can track the progress for the Python integration by looking at python-labelled issues at https://github.com/slint-ui/slint/labels/a%3Alanguage-python .

Slint Language Manual

The Slint Language Documentation covers the Slint UI description language in detail.

Prerequisites

Installation

Slint can be installed with uv or pip from the Python Package Index:

uv add slint

The installation uses binaries provided for macOS, Windows, and Linux for various architectures. If your target platform is not covered by binaries, uv will automatically build Slint from source. If that happens, you will then need some software development tools on your machine, as well as Rust.

Quick Start

  1. Create a new project with uv init.
  2. Add the Slint Python package to your Python project: uv add slint
  3. Create a file called app-window.slint:
import { Button, VerticalBox } from "std-widgets.slint";

export component AppWindow inherits Window {
    in-out property<int> counter: 42;
    callback request-increase-value();
    VerticalBox {
        Text {
            text: "Counter: \{root.counter}";
        }
        Button {
            text: "Increase value";
            clicked => {
                root.request-increase-value();
            }
        }
    }
}
  1. Create a file called main.py:
import slint

# slint.loader will look in `sys.path` for `app-window.slint`.
class App(slint.loader.app_window.AppWindow):
    @slint.callback
    def request_increase_value(self):
        self.counter = self.counter + 1

app = App()
app.run()
  1. Run it with uv run main.py

API Overview

Instantiating a Component

The following example shows how to instantiate a Slint component in Python:

app.slint

export component MainWindow inherits Window {
    callback clicked <=> i-touch-area.clicked;

    in property <int> counter;

    width: 400px;
    height: 200px;

    i-touch-area := TouchArea {}
}

The exported component is exposed as a Python class. To access this class, you have two options:

  1. Call slint.load_file("app.slint"). The returned object is a namespace, that provides the MainWindow class as well as any other explicitly exported component that inherits Window:

    import slint
    components = slint.load_file("app.slint")
    main_window = components.MainWindow()
    
  2. Use Slint's auto-loader, which lazily loads .slint files from sys.path:

    import slint
    # Look for for `app.slint` in `sys.path`:
    main_window = slint.loader.app.MainWindow()
    

    Any attribute lookup in slint.loader is searched for in sys.path. If a directory with the name exists, it is returned as a loader object, and subsequent attribute lookups follow the same logic.

    If the name matches a file with the .slint extension, it is automatically loaded with load_file and the namespace is returned.

    If the file name contains a dash, like app-window.slint, an attribute lookup for app_window tries to locate app_window.slint and then fall back to app-window.slint.

Accessing Properties

Properties declared as out or in-out in .slint files are visible as properties on the component instance.

main_window.counter = 42
print(main_window.counter)

Accessing Globals

Global Singletons are accessible in Python as properties in the component instance.

For example, this Slint code declares a PrinterJobQueue singleton:

export global PrinterJobQueue {
    in-out property <int> job-count;
}

Access it as a property on the component instance by its name:

print("job count:", instance.PrinterJobQueue.job_count)

Note: Global singletons are instantiated once per component. When declaring multiple components for export to Python, each instance has their own associated globals singletons.

Setting and Invoking Callbacks

Callbacks declared in .slint files are visible as callable properties on the component instance. Invoke them as functions to invoke the callback, and assign Python callables to set the callback handler.

In Slint, callbacks are defined using the callback keyword and can be connected to another component's callback using the <=> syntax.

my-component.slint

export component MyComponent inherits Window {
    callback clicked <=> i-touch-area.clicked;

    width: 400px;
    height: 200px;

    i-touch-area := TouchArea {}
}

The callbacks in Slint are exposed as properties and that can be called as functions.

main.py

import slint

component = slint.loader.my_component.MyComponent()
# connect to a callback

def clicked():
    print("hello")

component.clicked = clicked
// invoke a callback
component.clicked();

Another way to set callbacks is to sub-class and use the @slint.callback decorator:

import slint

class Component(slint.loader.my_component.MyComponent):
    @slint.callback
    def clicked(self):
        print("hello")

component = Component()

The @slint.callback() decorator accepts a name argument, if the name of the method does not match the name of the callback in the .slint file. Similarly, a global_name argument can be used to bind a method to a callback in a global singleton.

Type Mappings

Each type used for properties in the Slint Language translates to a specific type in Python. The following table summarizes the mapping:

.slint Type Python Type Notes
int int
float float
string str
color slint.Color
brush slint.Brush
image slint.Image
length float
physical_length float
duration float The number of milliseconds
angle float The angle in degrees
structure dict/Struct When reading, structures are mapped to data classes, when writing dicts are also accepted.
array slint.Model

Arrays and Models

You can set array properties from Python by passing subclasses of slint.Model.

Use the slint.ListModel class to construct a model from an iterable:

component.model = slint.ListModel([1, 2, 3]);
component.model.append(4)
del component.model[0]

When sub-classing slint.Model, provide the following methods:

    def row_count(self):
        """Return the number of rows in your model"""

    def row_data(self, row):
        """Return data at specified row"""

    def set_row_data(self, row, data):
        """For read-write models, store data in the given row. When done call set.notify_row_changed:"
        ..."""
        self.notify_row_changed(row)

When adding or inserting rows, call notify_row_added(row, count) on the super class. Similarly, when removing rows, notify Slint by calling notify_row_removed(row, count).

Structs

Structs declared in Slint and exposed to Python via export are then accessible in the namespace that is returned when instantiating a component.

app.slint

export struct MyData {
    name: string,
    age: int
}

export component MainWindow inherits Window {
    in-out property <MyData> data;
}

main.py

The exported MyData struct can be constructed as follows:

import slint
# Look for for `app.slint` in `sys.path`:
main_window = slint.loader.app.MainWindow()

data = slint.loader.app.MyData(name = "Simon")
data.age = 10
main_window.data = data

Third-Party Licenses

For a list of the third-party licenses of all dependencies, see the separate Third-Party Licenses page.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

slint-1.11.0a1.tar.gz (1.9 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

slint-1.11.0a1-cp310-abi3-win_amd64.whl (12.1 MB view details)

Uploaded CPython 3.10+Windows x86-64

slint-1.11.0a1-cp310-abi3-manylinux_2_35_x86_64.whl (16.6 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.35+ x86-64

slint-1.11.0a1-cp310-abi3-manylinux_2_31_armv7l.whl (15.7 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.31+ ARMv7l

slint-1.11.0a1-cp310-abi3-manylinux_2_31_aarch64.whl (16.0 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.31+ ARM64

slint-1.11.0a1-cp310-abi3-macosx_11_0_x86_64.whl (12.1 MB view details)

Uploaded CPython 3.10+macOS 11.0+ x86-64

slint-1.11.0a1-cp310-abi3-macosx_11_0_arm64.whl (11.6 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file slint-1.11.0a1.tar.gz.

File metadata

  • Download URL: slint-1.11.0a1.tar.gz
  • Upload date:
  • Size: 1.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for slint-1.11.0a1.tar.gz
Algorithm Hash digest
SHA256 028775b08f091a0eb3920a758eddb4a9bd46002b64d9535b19152ce7f21e705c
MD5 042292b194a079ae3c33cfcaff44f30c
BLAKE2b-256 8e10ea72e4806822ea3a2328b9e2c14fd538becbd2058247e0bc98d27c20cba2

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.11.0a1.tar.gz:

Publisher: upload_pypi.yaml on slint-ui/slint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slint-1.11.0a1-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: slint-1.11.0a1-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 12.1 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for slint-1.11.0a1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d64a60e3aa1bc82c1e0378c1b0b604ccf76d78a7034ce8fb4eaf4bc54debf2ff
MD5 6dcaaa05e2cc5de4bea8327f8dabb441
BLAKE2b-256 46dcd0806fccf83122c554067300fe50facd820163e93188e889e089f5968198

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.11.0a1-cp310-abi3-win_amd64.whl:

Publisher: upload_pypi.yaml on slint-ui/slint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slint-1.11.0a1-cp310-abi3-manylinux_2_35_x86_64.whl.

File metadata

File hashes

Hashes for slint-1.11.0a1-cp310-abi3-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 88d94a515c355c2b8715559a46576e7101bc8c19d1617f6e8da0092aa0b633a2
MD5 0ce1c9abc90f67227c259e5e0300ac7d
BLAKE2b-256 5104a257bd491a566dcbe837642d7f3e01a50d32d73ccf3b465e0f5217aba760

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.11.0a1-cp310-abi3-manylinux_2_35_x86_64.whl:

Publisher: upload_pypi.yaml on slint-ui/slint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slint-1.11.0a1-cp310-abi3-manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for slint-1.11.0a1-cp310-abi3-manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 856e5c952dc8bf7b240db3006ed440fc1776c4d8e8d64f5e33ed813118b0e776
MD5 7d679eaf47edace5155709430c1d81d5
BLAKE2b-256 0db006c196f1211d0cc6dd754a7e6f785c126996af4999b7faf4c0144c9d3fcf

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.11.0a1-cp310-abi3-manylinux_2_31_armv7l.whl:

Publisher: upload_pypi.yaml on slint-ui/slint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slint-1.11.0a1-cp310-abi3-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for slint-1.11.0a1-cp310-abi3-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 abb9e9bf85734dacc30b8d3c6dbef363c68192b32bfb036ba3562317f895fc55
MD5 05049d04ee15423bb55c41498be39118
BLAKE2b-256 d0bce449531fab75a6f99def98dd269e8cfb0e91f5467f4d557ea3dd5c6934e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.11.0a1-cp310-abi3-manylinux_2_31_aarch64.whl:

Publisher: upload_pypi.yaml on slint-ui/slint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slint-1.11.0a1-cp310-abi3-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for slint-1.11.0a1-cp310-abi3-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 ad6d051b46d82a1d234ed07a6bed0da6b6341fe4aeaf8a0f364923fedf72e4ce
MD5 767732b4cc27b48f9d2b98da3d7c8893
BLAKE2b-256 b6b283af32afba994576702be36c731557d886a23e9c4d7a837966cc5067a57a

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.11.0a1-cp310-abi3-macosx_11_0_x86_64.whl:

Publisher: upload_pypi.yaml on slint-ui/slint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slint-1.11.0a1-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slint-1.11.0a1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9ac07a7d1e5a2adc836609cda7c1738fa84505bfd640396c51c79690733810dc
MD5 134e0340d634d5c3ad13de35b40528df
BLAKE2b-256 a950aa0a5b7f87789d716774498ac7e65cd7651df1725390038d465b41a4a693

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.11.0a1-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: upload_pypi.yaml on slint-ui/slint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page