Skip to main content

GUI toolkit to efficiently develop fluid graphical user interfaces for embedded devices and desktop applications

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

Install Slint 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. See the type mappings table in the Slint Python documentation for the complete list.

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

Enums

Enums declared in Slint and exposed to Python via export are then accessible in the namespace that is returned when instantiating a component. The enums are subclasses of enum.Enum.

app.slint

export enum MyOption {
    Variant1,
    Variant2
}

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

main.py

Variants of the exported MyOption enum can be constructed as follows:

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

value = slint.loader.app.MyOption.Variant2
main_window.data = value

Asynchronous I/O

Use Python's asyncio library to write concurrent Python code with the async/await syntax.

Slint's event loop is a full-featured asyncio event loop. While the event loop is running, asyncio.get_event_loop() returns a valid loop. To run an async function when starting the loop, pass a coroutine to slint.run_event_loop().

For the common use case of interacting with REST APIs, we recommend the aiohttp library.

Known Limitations

  • Pipes and sub-processes are only supported on Unix-like platforms.

Type Hints

PEP 484 introduces a standard syntax for type annotations to Python, enabling static analysis for type checking, refactoring, and code completion. Popular type checkers include mypy, Pyre, and Astral's ty.

Use Slint's slint-compiler to generate stub .py files for .slint files, which are annotated with type information. These replace the need to call load_file or any use of slint.loader.

  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. Run the slint-compiler to generate app_window.py: uvx slint-compiler -f python -o app_window.py app-window.slint

  2. Create a file called main.py:

import slint
import app_window

class App(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

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.17.1b2.tar.gz (2.6 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.17.1b2-cp311-abi3-win_amd64.whl (11.9 MB view details)

Uploaded CPython 3.11+Windows x86-64

slint-1.17.1b2-cp311-abi3-manylinux_2_35_x86_64.whl (15.9 MB view details)

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

slint-1.17.1b2-cp311-abi3-manylinux_2_31_armv7l.whl (15.2 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.31+ ARMv7l

slint-1.17.1b2-cp311-abi3-manylinux_2_31_aarch64.whl (15.4 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.31+ ARM64

slint-1.17.1b2-cp311-abi3-macosx_11_0_arm64.whl (10.7 MB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

slint-1.17.1b2-cp311-abi3-ios_13_0_arm64_iphonesimulator.whl (13.5 MB view details)

Uploaded CPython 3.11+iOS 13.0+ ARM64 Simulator

slint-1.17.1b2-cp311-abi3-ios_13_0_arm64_iphoneos.whl (13.3 MB view details)

Uploaded CPython 3.11+iOS 13.0+ ARM64 Device

File details

Details for the file slint-1.17.1b2.tar.gz.

File metadata

  • Download URL: slint-1.17.1b2.tar.gz
  • Upload date:
  • Size: 2.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for slint-1.17.1b2.tar.gz
Algorithm Hash digest
SHA256 de126057b48983cdf8527d7a7217738ba3bdfb0b01deb1681e2ec1d315c0ea56
MD5 531077d120aa4874e24a0b5836813e8b
BLAKE2b-256 741a24d2b224e72c26d70c2bcca1ca188657abcc8c4c19635a3ae60c628a199c

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.17.1b2.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.17.1b2-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: slint-1.17.1b2-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 11.9 MB
  • Tags: CPython 3.11+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for slint-1.17.1b2-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 68cbb5365a69b28b70e354e98fdc541f6584f3a41be79b336b4b70e8f280db29
MD5 f49336fa2bad60a1811da3a158a9900c
BLAKE2b-256 e82103be49a3a9d99b7f4e440c723f717d74071987f5b4b777ff4996ff700db1

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.17.1b2-cp311-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.17.1b2-cp311-abi3-manylinux_2_35_x86_64.whl.

File metadata

File hashes

Hashes for slint-1.17.1b2-cp311-abi3-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 ac004b4c653d8dff00d68b075657b26fb1310fafd2559cbab659d2dbcdbadbdd
MD5 661c4396a00791fa774a0bad6c9b2b50
BLAKE2b-256 78a9a6d304677abe466ecd3ec973fecb81e7c84180290d2f304e026770680f44

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.17.1b2-cp311-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.17.1b2-cp311-abi3-manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for slint-1.17.1b2-cp311-abi3-manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 cccaf1a0f8f4363fee8a2ecb3b7f82df10b618c92393633a7b4eb6d1691ff147
MD5 b3e32a3ad7e58d81937943b0b3956cac
BLAKE2b-256 ae9e7d0c98389833d99c1c5dab7cb1d909f73ac4acab252153cdf53f42ed38f9

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.17.1b2-cp311-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.17.1b2-cp311-abi3-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for slint-1.17.1b2-cp311-abi3-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 a4b0d411e5f26ee590efb6723d289985db7d3fc803d2b020367149ab69ced48b
MD5 9fb991465dcaa5d51ea6b04581dbc0ce
BLAKE2b-256 30740ad0941bbf734bc381f9d21053fb7a0413998f8489feb008e4e0422cb9db

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.17.1b2-cp311-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.17.1b2-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slint-1.17.1b2-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2db83b5d7639e830c0d782e5e3b7f93ae8cf48d8849ed738fdcc05f544e25d72
MD5 42886c4b3adccc39513a0e7cef8bd370
BLAKE2b-256 b0ac3bedfd3400572b7d341036f7e89e7ab353a7caf96cb1c0e206f4b4ed6d6d

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.17.1b2-cp311-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.

File details

Details for the file slint-1.17.1b2-cp311-abi3-ios_13_0_arm64_iphonesimulator.whl.

File metadata

File hashes

Hashes for slint-1.17.1b2-cp311-abi3-ios_13_0_arm64_iphonesimulator.whl
Algorithm Hash digest
SHA256 f711b40c53d5c85db19bca767c3de198441141cfd8cf90879204de9b3e603b30
MD5 67199c70b8ef625728c2dd1df9208dc3
BLAKE2b-256 2e8f4871d2acc8c56c0df684904e4e383293f70d5a2abbd4b304c161787e6094

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.17.1b2-cp311-abi3-ios_13_0_arm64_iphonesimulator.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.17.1b2-cp311-abi3-ios_13_0_arm64_iphoneos.whl.

File metadata

File hashes

Hashes for slint-1.17.1b2-cp311-abi3-ios_13_0_arm64_iphoneos.whl
Algorithm Hash digest
SHA256 cb8e7977be7d063da245f1cdc91c19db32cd3c93ae92df70fd5b2ff4e0fef397
MD5 5266a8b57776a44a9731d180d1fdfb42
BLAKE2b-256 cbf2562f29f13627efc1f495797b8f4097928cc6a5e4f416b60fe4d778d5e36d

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.17.1b2-cp311-abi3-ios_13_0_arm64_iphoneos.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