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:

    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.0a7.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.0a7-cp310-abi3-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.10+Windows x86-64

slint-1.6.0a7-cp310-abi3-manylinux_2_35_x86_64.whl (5.9 MB view details)

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

slint-1.6.0a7-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (6.1 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARMv7l

slint-1.6.0a7-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.8 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

slint-1.6.0a7-cp310-abi3-macosx_11_0_x86_64.whl (3.5 MB view details)

Uploaded CPython 3.10+macOS 11.0+ x86-64

slint-1.6.0a7-cp310-abi3-macosx_11_0_arm64.whl (3.3 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: slint-1.6.0a7.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.0a7.tar.gz
Algorithm Hash digest
SHA256 53374825e1d83f950490972c6cecb7a047f644b68997ba8ceb081e5893576aee
MD5 9c9aec5a42f0ac48e99a47b33d6687c2
BLAKE2b-256 cf77812b6c6d6bcff5bf5d2d5da4d4c3c1ac09687f3ae943c6b59044b71a88bf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: slint-1.6.0a7-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 3.2 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.0a7-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 773ce68b4817e2fd691ee6944de7b833b2d0bf18ba17b06c900bfb4a07b90ef3
MD5 15bc3bcd2469de4f5af4861e419eb326
BLAKE2b-256 30551b58bb0fbcba70c13991fb34a8335eb853a52085d6e0856a07c20a5dea32

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slint-1.6.0a7-cp310-abi3-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 8bc432a4a703789be55058b6cebdf758aede5c14f1b3fa9359a7ff679cec408f
MD5 e9dfd60b33a519677eaa389d629ee980
BLAKE2b-256 36a4349e615ca5dc2b1cec077f5004c44e4cd7f39fb68face409144c9d2a8c1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slint-1.6.0a7-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 dbd2d60578f61f8c8ff16fb09ae709dd24d0f0905564b333c581d7bc5a21f95a
MD5 a14ab5bcff719da0921c4c5cf1192b5e
BLAKE2b-256 4898d3b1b488c23c617427fe0dafc94f4773824f6a45694510b0d04d0efae48b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slint-1.6.0a7-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 106f1d34f53c4adae1fe65d46f7c56068a58e9681ba5ad62fc02040bf28bea50
MD5 bbd87ba81ce0f6ccbe9aa0ced413c2a4
BLAKE2b-256 30b76a46552888ec00af5e185dc5fb84ee9f1350627858d896e36746100ec830

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slint-1.6.0a7-cp310-abi3-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 4cc0d83eb4a20034fdbe6855b322bad5e946194f1bac50f177dcf834922c4c90
MD5 28f89c2813254cc7b0dbbbc252409fec
BLAKE2b-256 7c0eb54040626f299cc6c9559f2b773700c8ad9ad6a7f256fab1b15960d6e684

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slint-1.6.0a7-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 92773bbce12ba11c05e36524843eb6af675a6b83a2936d38a4f87d903d654b98
MD5 0b2d44f9fb7337abb1a719f4db00ecb8
BLAKE2b-256 afb29db0871dbfd3ebc264d9201add23c73644bf49620cb5fde4853b4dcda416

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