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 from the Python Package Index:

pip install slint

The installation will use binaries provided vi macOS, Windows, and Linux for various architectures. If your target platform is not covered by binaries, pip 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 examples/printerdemo/python
pipenv update
pipenv run python main.py

Quick Start

  1. Add Slint Python Package Index to your Python project: pipenv install slint
  2. Create a file called appwindow.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

class App(slint.loader.appwindow.AppWindow):
    @slint.callback
    def request_increase_value(self):
        self.counter = self.counter + 1

app = App()
app.run()
  1. Run it with pipenv run python 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:

    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.

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:

export global PrinterJobQueue {
    in-out property <int> job-count;
}
print("job count:", instance.PrinterJobQueue.job_count)

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
import MyComponent from my_component_slint

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
import my_component_slint

class Component(my_component_slint.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 Structures are mapped to Python dictionaries where each structure field is an item.
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).

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.6.0a6.tar.gz (1.8 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.6.0a6-cp310-abi3-win_amd64.whl (3.3 MB view details)

Uploaded CPython 3.10+Windows x86-64

slint-1.6.0a6-cp310-abi3-manylinux_2_35_x86_64.whl (6.0 MB view details)

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

slint-1.6.0a6-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (6.2 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARMv7l

slint-1.6.0a6-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.0 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

slint-1.6.0a6-cp310-abi3-macosx_11_0_x86_64.whl (3.6 MB view details)

Uploaded CPython 3.10+macOS 11.0+ x86-64

slint-1.6.0a6-cp310-abi3-macosx_11_0_arm64.whl (3.4 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file slint-1.6.0a6.tar.gz.

File metadata

  • Download URL: slint-1.6.0a6.tar.gz
  • Upload date:
  • Size: 1.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for slint-1.6.0a6.tar.gz
Algorithm Hash digest
SHA256 fbbf2cc94bdb6bb430cb22c1be70ad1d68db9bac6ac062a8af16d26c87670284
MD5 89d885315e0973ab2b754a7136cc944a
BLAKE2b-256 be1e62d2a06bcd7cdc27343d89f1ad1b31071dea1e2ff2f288413420e928d948

See more details on using hashes here.

File details

Details for the file slint-1.6.0a6-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: slint-1.6.0a6-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 3.3 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for slint-1.6.0a6-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 b339a4544ffd5fa60256390c5528a2f2152ba8ebbbd6435a708a2e2911159650
MD5 83b610ed34bf08c798fd3ed109466c3a
BLAKE2b-256 c7a278641998218361b65675ddf3b692611b28e18b9dad7386357c995185895d

See more details on using hashes here.

File details

Details for the file slint-1.6.0a6-cp310-abi3-manylinux_2_35_x86_64.whl.

File metadata

File hashes

Hashes for slint-1.6.0a6-cp310-abi3-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 3b0bb8b54d9782aa42e1712446bba166e3610b35dc84fb78a20a6d1d84f5b977
MD5 d9b48b589629b174a6e785493f1048a1
BLAKE2b-256 a5e7327d249ea09917ae5397fe2cefd537b9fe10fb644d8a993b20a145a204dd

See more details on using hashes here.

File details

Details for the file slint-1.6.0a6-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for slint-1.6.0a6-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 62eb38308cbefb4a9823c8ad7ccbd717c76a0b69afee9940ff8248ba16465d7c
MD5 83b4c49846ab9574318da5db4ed68a33
BLAKE2b-256 56abebd4f446070a23b519bb99f3d2743cfe66aa143a1c4e7203923d74c6495f

See more details on using hashes here.

File details

Details for the file slint-1.6.0a6-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for slint-1.6.0a6-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6b537698e3305855c5478c3dd4f342d8dcd300e1fe7f39b7f66db802e2f6aca6
MD5 6278fcf0267f958e90e13982f719911f
BLAKE2b-256 9c5dcea698cf92149a4fbae8d29ae72781211689d3111591c5a5b1f83ffecb72

See more details on using hashes here.

File details

Details for the file slint-1.6.0a6-cp310-abi3-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for slint-1.6.0a6-cp310-abi3-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 a3caffe4f19709815d40ca746c2f2bc4bbf6ffde6d430cc5349b864271f91a0b
MD5 209b8502a8ebf78455dc29950026b780
BLAKE2b-256 19ca3ac5b4aa33f225b3e7a9eb3aa718d007ae917445316e198fd6cdf5657578

See more details on using hashes here.

File details

Details for the file slint-1.6.0a6-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slint-1.6.0a6-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ee7de4fd952a9f8e746e7d8c8e2a72d7bfb9144076380bfd9181a4f9c9122130
MD5 8a41bccb390ff1210d2a0fba7c979bb7
BLAKE2b-256 0d06552fa2b4c64e72f1e63e12c98e5a72513360df81727f365ad1fe5426e8c9

See more details on using hashes here.

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