Skip to main content

Slint Python integration

Project description

Slint-python (Alpha)

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

Warning: Alpha Slint-python is still in the very early stages of development: APIs will change and important features are still being developed, the project is overall incomplete.

You can track the overall 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 pip or uv from the Python Package Index:

uv add slint

The installation will use binaries provided vi 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 need common software development tools on your machine, as well as Rust.

Building from Source

Try it out

If you want to just play with this, you can try running our Python port of the printer demo:

cd demos/printerdemo/python
uv run main.py

Quick Start

  1. Create a new project with uv init.
  2. Add Slint Python Package Index 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, which contains classes for each exported component that inherits Window. If the file name contains a dash, like app-window.slint, an attribute lookup for app_window will first try 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 will have their own instance of associated globals singletons.

Setting and Invoking Callbacks

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

Callbacks in Slint can be defined using the callback keyword and can be connected to a callback of an other component 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 a function.

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 named argument, when 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

The types used for properties in the Slint Language each translate to specific types in Python. The follow table summarizes the entire 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

Array properties can be set 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/inserting rows, call notify_row_added(row, count) on the super class. Similarly, removal requires notifying Slint by calling notify_row_removed(row, count).

Structs

Structs declared in Slint and exposed to Python via export are accessible in the namespace 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

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

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.10.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.10.0a1-cp310-abi3-win_amd64.whl (12.0 MB view details)

Uploaded CPython 3.10+Windows x86-64

slint-1.10.0a1-cp310-abi3-manylinux_2_35_x86_64.whl (16.4 MB view details)

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

slint-1.10.0a1-cp310-abi3-manylinux_2_31_armv7l.whl (15.6 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.31+ ARMv7l

slint-1.10.0a1-cp310-abi3-manylinux_2_31_aarch64.whl (15.8 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.31+ ARM64

slint-1.10.0a1-cp310-abi3-macosx_11_0_x86_64.whl (12.0 MB view details)

Uploaded CPython 3.10+macOS 11.0+ x86-64

slint-1.10.0a1-cp310-abi3-macosx_11_0_arm64.whl (11.4 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: slint-1.10.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.10.0a1.tar.gz
Algorithm Hash digest
SHA256 185af9a8b6975052c7c77365c77e1602cb1f9f56f13bf4f3a17d6f0131c39f93
MD5 487c2e49e9fe63077fb1398f5f6a1c4e
BLAKE2b-256 e6bc9e281c6fc9300e987411f46703b63220a0377c778f7bb0718c9296e65a04

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.10.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.10.0a1-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: slint-1.10.0a1-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 12.0 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.10.0a1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 64d9ba4b630fcb10411d6f5d53c1a7af918d6b40294d5e620d6b073015065b7a
MD5 81d89a1bc9e05fae73bd2a1c331679dc
BLAKE2b-256 5b09bca7b7f13b33b73cbbdd0602d1ba6499f009c61d8451534a0160f06b4fbd

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.10.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.10.0a1-cp310-abi3-manylinux_2_35_x86_64.whl.

File metadata

File hashes

Hashes for slint-1.10.0a1-cp310-abi3-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 7462789714989f2b0ea90fdddec65f7d5a2b032fc11f1b37de20d611f4afd2d3
MD5 7e3bb5098dd7c0e2006415e00ea00788
BLAKE2b-256 4fe5f5986f5039dce2a78c690aa2fe6df8def4aaf7c5c6557eae6eff98a160d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.10.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.10.0a1-cp310-abi3-manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for slint-1.10.0a1-cp310-abi3-manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 e506cbc8e616c3d7113307f5dbf4f33e4a1a188ad41cb6f4f60c82e9b319c070
MD5 e708c895877e2791f8a55975625d98c3
BLAKE2b-256 d493137c18e14b0b9007a7e9745c6b47f02281db7220fec82ace1c594a6c0167

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.10.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.10.0a1-cp310-abi3-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for slint-1.10.0a1-cp310-abi3-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 3e90feb4ee7513f8e6999e551faf5b2dd8f65dbca18df4e1f56735fd38d848ac
MD5 3eed208a682840a230694ad3950c9cb4
BLAKE2b-256 36d81a048116c2015edd1ea9f35c86db8e9c57efc572d9cd61b542e38395bf5f

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.10.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.10.0a1-cp310-abi3-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for slint-1.10.0a1-cp310-abi3-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 315813ad47330485887ae17d47366887a506b327e4e1831284853c2b6b0f7805
MD5 61370f01446ca5ace06378335d30faa4
BLAKE2b-256 60ef7491d3c7bc0eaf1de31b04d389671e690ea38ef37260da10db9b321e6f47

See more details on using hashes here.

Provenance

The following attestation bundles were made for slint-1.10.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.10.0a1-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slint-1.10.0a1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 70a97796d16a7ed9fe572868ad204ab5e68d33037b7a780200a38581213d9992
MD5 1efe7af1397c387db86a803efc153fbc
BLAKE2b-256 a718434394908b76d960d999405f7ade9583ad01bfe222bd1e26ab56e5d51890

See more details on using hashes here.

Provenance

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