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

# slint.loader will look in `sys.path` for `appwindow.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 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.

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

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.7.0a4.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.7.0a4-cp310-abi3-win_amd64.whl (11.6 MB view details)

Uploaded CPython 3.10+Windows x86-64

slint-1.7.0a4-cp310-abi3-manylinux_2_35_x86_64.whl (15.9 MB view details)

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

slint-1.7.0a4-cp310-abi3-manylinux_2_31_armv7l.whl (15.1 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.31+ ARMv7l

slint-1.7.0a4-cp310-abi3-manylinux_2_31_aarch64.whl (15.5 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.31+ ARM64

slint-1.7.0a4-cp310-abi3-macosx_11_0_x86_64.whl (11.5 MB view details)

Uploaded CPython 3.10+macOS 11.0+ x86-64

slint-1.7.0a4-cp310-abi3-macosx_11_0_arm64.whl (11.0 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file slint-1.7.0a4.tar.gz.

File metadata

  • Download URL: slint-1.7.0a4.tar.gz
  • Upload date:
  • Size: 1.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.4

File hashes

Hashes for slint-1.7.0a4.tar.gz
Algorithm Hash digest
SHA256 2d3f321d0cc6d23877d8458d87993422299de28391a3681fb8ca895a8b0943fb
MD5 5cdcc8ea74e8f022425c3e5c3f428512
BLAKE2b-256 bc9f1e94c2376f8dccc07add1accd24145a5efa07129ff03759ba3b529f14ce6

See more details on using hashes here.

File details

Details for the file slint-1.7.0a4-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: slint-1.7.0a4-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 11.6 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.0 CPython/3.12.4

File hashes

Hashes for slint-1.7.0a4-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 df92349245b86ec8327007c3047247b932766bb59a2eaa9dce2cd82c76a598aa
MD5 38e25c68ea1e29f68b35f8e3a881ca97
BLAKE2b-256 886176ad11410f7ee19947d1312a34e9e976dcdf569a8590e474306e05792163

See more details on using hashes here.

File details

Details for the file slint-1.7.0a4-cp310-abi3-manylinux_2_35_x86_64.whl.

File metadata

File hashes

Hashes for slint-1.7.0a4-cp310-abi3-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 b824c820bab3c4253111b0fa22cfa49062aabbfdc3a4a191cf3ad9cbb029270a
MD5 19e861ccbe6e659bc539b999754edfee
BLAKE2b-256 1177ae5d9b91e59824a8dab74fd3a88bed1877b8bf710f90e8bd55c197935912

See more details on using hashes here.

File details

Details for the file slint-1.7.0a4-cp310-abi3-manylinux_2_31_armv7l.whl.

File metadata

File hashes

Hashes for slint-1.7.0a4-cp310-abi3-manylinux_2_31_armv7l.whl
Algorithm Hash digest
SHA256 5a8474483a7902da1709502cd6af8f56d5b6bbca49f60788750f737fba31cff0
MD5 02073f3a7701eaee0bfe28735d56cb40
BLAKE2b-256 64e9ccab4ce6a50295a88c8e3a708486ef96b418dbdc2e72fc828910938e85b9

See more details on using hashes here.

File details

Details for the file slint-1.7.0a4-cp310-abi3-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for slint-1.7.0a4-cp310-abi3-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 658ac79f2efc5fb2747bced2ea2f451db48d74bdda07f66174715ff7513ca8d3
MD5 cb32e0317c8888fe714eae0daa54d64c
BLAKE2b-256 37d9e17db784b96c9312d747fce1d3b3875d5eb1a03dcfb696bdb1dc961049b0

See more details on using hashes here.

File details

Details for the file slint-1.7.0a4-cp310-abi3-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for slint-1.7.0a4-cp310-abi3-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 610e8ae1d9605d28f2e5a2a097d5afb3d3a5986fd0a7d2ede87239ef00007584
MD5 1a7d3970e66b63aecae1a31b444c6d1e
BLAKE2b-256 80ffb382d5cf7f3b0c55ccb6d71baeedb57be1b747e424f34b1ebb273ca62c07

See more details on using hashes here.

File details

Details for the file slint-1.7.0a4-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slint-1.7.0a4-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d9643347975d4fedc09770e4ac913748933c81105bcc503d743233fbfa80532c
MD5 34ef5af566b5badb448512d8373e668d
BLAKE2b-256 cc5c8f797642f8a2b25928e7b101ba5c38177c4efafc7ab6cd1dc170591c0323

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