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

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.15.0b1.tar.gz (2.1 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.15.0b1-cp314-cp314t-manylinux_2_31_armv7l.whl (12.0 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.31+ ARMv7l

slint-1.15.0b1-cp314-cp314t-manylinux_2_31_aarch64.whl (12.3 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.31+ ARM64

slint-1.15.0b1-cp313-cp313t-manylinux_2_31_armv7l.whl (12.0 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.31+ ARMv7l

slint-1.15.0b1-cp313-cp313t-manylinux_2_31_aarch64.whl (12.3 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.31+ ARM64

slint-1.15.0b1-cp311-abi3-win_amd64.whl (8.7 MB view details)

Uploaded CPython 3.11+Windows x86-64

slint-1.15.0b1-cp311-abi3-manylinux_2_35_x86_64.whl (12.7 MB view details)

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

slint-1.15.0b1-cp311-abi3-manylinux_2_31_armv7l.whl (12.0 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.31+ ARMv7l

slint-1.15.0b1-cp311-abi3-manylinux_2_31_aarch64.whl (12.3 MB view details)

Uploaded CPython 3.11+manylinux: glibc 2.31+ ARM64

slint-1.15.0b1-cp311-abi3-macosx_11_0_arm64.whl (7.8 MB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

slint-1.15.0b1-cp311-abi3-ios_13_0_arm64_iphonesimulator.whl (7.3 MB view details)

Uploaded CPython 3.11+iOS 13.0+ ARM64 Simulator

slint-1.15.0b1-cp311-abi3-ios_13_0_arm64_iphoneos.whl (7.2 MB view details)

Uploaded CPython 3.11+iOS 13.0+ ARM64 Device

File details

Details for the file slint-1.15.0b1.tar.gz.

File metadata

  • Download URL: slint-1.15.0b1.tar.gz
  • Upload date:
  • Size: 2.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for slint-1.15.0b1.tar.gz
Algorithm Hash digest
SHA256 85e7e81e3b98d227ed0cac0f6ca7caeaa22fb8db04bfb1d1258ae9dbeb925f3b
MD5 c5cdc057124581c12ea4690bdaa9aed6
BLAKE2b-256 98fc539fd9f0cb075bc29df4ab8f402957444c64d5e24d5904720e62cab5e447

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1.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.15.0b1-cp314-cp314t-manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for slint-1.15.0b1-cp314-cp314t-manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 69b3402b7cf3dede60c3de54a8fafff738e99c03eedd34c466b3d8c0646e31ce
MD5 722ed48461dc224057636ce6c954ad6c
BLAKE2b-256 e27ca2c57178843e122acff68b83b368c9b92017223c80fc35e27d0bd83f8766

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1-cp314-cp314t-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.15.0b1-cp314-cp314t-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for slint-1.15.0b1-cp314-cp314t-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 1b7cc37ed4e34041b29dbec852cfb548684813a2c7ec24f14fc522dbcb7548e6
MD5 8c5de45f0b17e9f52fd108d8a7284270
BLAKE2b-256 13cc1a12bc210e4d327b9e697109735520436dda05c1894a0f7646003393cf0b

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1-cp314-cp314t-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.15.0b1-cp313-cp313t-manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for slint-1.15.0b1-cp313-cp313t-manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 a35815dfb418441b5b7b679d89f1594fee3bee87d01ab8fb098c3bc91d1d5dac
MD5 219b58dd07372f15f8e85a94e7cb68c0
BLAKE2b-256 d1fbeddef638ec76035b28715bf3d931bc266a3d7dcd7b047a56dd1518b9a233

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1-cp313-cp313t-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.15.0b1-cp313-cp313t-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for slint-1.15.0b1-cp313-cp313t-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 ed14d5153ae2f4088a68b08ec2ee7a0a38477787e219f566f05c7e7656004f3f
MD5 7a37c5bbd737df253017f49a0137b387
BLAKE2b-256 912e08e8cdfdcafd478717f33767715833e215dcd5fa5e9aaab061de11ccaed4

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1-cp313-cp313t-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.15.0b1-cp311-abi3-win_amd64.whl.

File metadata

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

File hashes

Hashes for slint-1.15.0b1-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 f1e38f8964f7c033be2a9515ed670d36248345c643a48b7d4ea3dd94f69167b6
MD5 a3ad368ee16542cb1076d095e381679e
BLAKE2b-256 5ec5eac9993e046bc31089cfeb7ba0881c89eaff591dfe91a64388851d114d38

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1-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.15.0b1-cp311-abi3-manylinux_2_35_x86_64.whl.

File metadata

File hashes

Hashes for slint-1.15.0b1-cp311-abi3-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 06996e6ab135e91f7a1ee57f6e84d5472fbf5556522390a9c765e60d6252d65a
MD5 9c6d477f825a688da49e1c4bac9a7b5d
BLAKE2b-256 cd89fd04b4eee5b838643a5bb394c8e4477ee8b71c236de6c2387563e1e71834

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1-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.15.0b1-cp311-abi3-manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for slint-1.15.0b1-cp311-abi3-manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 53099774b25af2b153b69463d6ecf2ddf81bec0b109719908f7bd2ce40f4a276
MD5 5299cf598d1b0b6332e143d4892817e3
BLAKE2b-256 e0fd8a7b4b9a3e35d6fd199412839d282b3b490427604e45a2bade05c29f407b

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1-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.15.0b1-cp311-abi3-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for slint-1.15.0b1-cp311-abi3-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 c322445e0c98318dbbe58d53061d6fca32938defe5797cc9494e9de4a5bc28cc
MD5 1888360d269d401ac1cfa0519b753785
BLAKE2b-256 364628e6665474a43bd2125e06c4189c64dfcb0b5338397b5136f979ef056ea2

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1-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.15.0b1-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slint-1.15.0b1-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7a9cf08a9cda6db769e38e5dbe4c69641dc5a2421aa17e978ddf09fc6c31eb29
MD5 332644fe243989bac13f49c624342275
BLAKE2b-256 a5741974456d39b92835dcbc4b59324daf0f84fc3bfbcffb2aba5a15918cfbef

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1-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.15.0b1-cp311-abi3-ios_13_0_arm64_iphonesimulator.whl.

File metadata

File hashes

Hashes for slint-1.15.0b1-cp311-abi3-ios_13_0_arm64_iphonesimulator.whl
Algorithm Hash digest
SHA256 7e9576c1ed53f1ce684afe60878af26107e3a99b7a2c2768664ac02450a19473
MD5 d893004f1f4fdda2507321c0c34acf7e
BLAKE2b-256 56f5296ebe7d8176a8cf1d8c16cb2ae12140d54222356d8e587ac30d52a454a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1-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.15.0b1-cp311-abi3-ios_13_0_arm64_iphoneos.whl.

File metadata

File hashes

Hashes for slint-1.15.0b1-cp311-abi3-ios_13_0_arm64_iphoneos.whl
Algorithm Hash digest
SHA256 c3d9f802fbd7a370626e3c2d8e47f62fb39f75b7f5728b120110253e618eca8e
MD5 257f49085c20e01e713284f9db5a98b6
BLAKE2b-256 458cd528e9d18214c2d12cc8061b7eadb825843a3c74f6e094e74b840d954cb7

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.15.0b1-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